11

===演算子を使用することの重要性に気付いたのは今日だけです。次の例で確認できます。

$var=0;
if ($var==false) echo "true"; else echo "false";  //prints true
$var=false;
if ($var==false) echo "true"; else echo "false";  //prints true
$var=0;
if ($var===false) echo "true"; else echo "false";  //prints false
$var=false;
if ($var===false) echo "true"; else echo "false";  //prints true 

問題は、 ==演算子を使用する代わりに===演算子を使用することが重要な状況があるかということです。

4

9 に答える 9

13

もちろん、ほんの一例です:array_search()

警告

この関数は Boolean を返す場合がありますが、またはなどのFALSEに評価される非ブール値を返す場合もあります。詳細については、ブール値のセクションを参照してください。この関数の戻り値をテストするには、演算子を使用します。FALSE0""===

基本的に、成功時に値を返し、FALSE失敗時に値を返す関数を使用する場合は、結果を確認する必要===があります (そうしないと、なぜ大きな赤い警告ボックスが表示されるのでしょうか? ;))


その他の例: next()、 または前述の文字列関数として、など。current()
strpos()stripos()

substr()明示的に言及されていませんが:

文字列の抽出された部分を返します。失敗した場合は FALSE を返します。

しかし、抽出された部分が の場合はどうなる"0"でしょうか。も評価されFALSEますが、エラーではありません。

于 2010-06-21T12:32:27.067 に答える
7

は推移的ではないため、が必要であると確信している場合を除いて、常に選択===してください。そしてそれは、コードについての推論にとって重要です。======

次のコード スニペットを検討してください。

if ( $a == $b && $b == $c ) {
    // [1] assert: $a == $c
}

$a == $c等値関係が推移的であることに慣れているため、誰もが if 条件からアサーションが真であると推測するでしょう。==しかし、それは反例には当てはまりません:

$a = "0";
$b = 0;
$c = null;

ここで、コードを記述しているときに (時には無意識に) その仮定を行う頻度について考えてみましょう。それは深刻なバグにつながる可能性があります。

于 2010-06-21T12:43:00.907 に答える
6

文字列が見つかったstrpos()場合は 0 になり、見つからない場合は false になります。===違いを確認するために使用する必要があります。

于 2010-06-21T12:35:05.320 に答える
3

厳密な型比較演算子は、===だけでなくそのもチェックしますが、が同じかどうかのみをチェックします。==

数値または文字列を比較するときの状況を考えてみましょう:

if (4 === 4) // same type and value
{
  // true
}

しかし

if (4 == "4") // same value but different type
{
  // true
}

if (4 === "4") // same value but different type
{
  // false
}

したがって、上記の場合、== または === のどちらを使用するかを賢明に選択する必要があります。

于 2010-06-21T12:31:54.773 に答える
3

問題が発生する良い例は、0 と文字列 fx の比較です。

if (0 == 'completed') {
  // evaluates as TRUE
}

数字で始まらない文字列は0、int に変換すると になります。これは、0 になる可能性があるステータスを文字列と比較するときに問題になる可能性があります。

于 2010-06-21T12:43:17.827 に答える
2

演算子は、===値の等価性だけでなく型もチェックします。

0 === false同じ型ではないため、 true を返さないのはそのためです。

于 2010-06-21T12:33:08.213 に答える
1

strpos($needle,$haystack) および関連する関数は、$needle が $haystack に存在しない場合は false を返し、$needle が $haystack の最初の文字である場合は 0 を返します。似たような機能がたくさんあります。この場合、== を使用すると誤った結果が得られる可能性があるため、常に === を使用する必要があります。マニュアルは、これが必要な場所を明確に示しています。

于 2010-06-21T12:36:28.103 に答える
0

2 つの数値文字列を比較する場合、それらは整数として比較されます。1

var_dump("15" == "0xF"); // TRUE
var_dump("15" === "0xF"); // FALSE

TRUE は間接的に FALSE と等しい2

$a = 0;
$b = 'x';
var_dump(FALSE == $a); // TRUE
var_dump($a == $b);  // TRUE
var_dump($b == TRUE);  // TRUE
var_dump(FALSE === $a); // FALSE
var_dump($a === $b);  // FALSE
var_dump($b === TRUE);  // FALSE
于 2010-06-21T13:15:44.230 に答える
0

私は最近、簡単な SQL クエリ パーサーを作成していたときに、この問題に遭遇しました。話を短くするために、引用されたパラメーターをそれらのコーナーケースのプレースホルダーと比較していました。基本的に、次のコードにより、デバッグに苦労しました(もちろん、例は単純化されています)

$var = 0; // This is supplied dynamically

$someCondition = $var == '?';

$someConditionずっと本当だった。震える

基本的に、厳密でない (==) <int> == <string> 比較では、文字列が整数にキャストされます。入力に応じて、文字列全体が完全に数値でなくても、これは 0 または文字列の int 値 (存在する場合) になる可能性があります。

于 2010-06-21T12:35:19.300 に答える