場合によっては、PHP は数値データ (数値を含む 文字列 など) を数値処理に変換します。 == 演算子 もその 1 つです。 == 演算子を使用して 2 つの文字列を大まかに比較すると、PHP は数値文字列を比較用の数値に変換します。次の実験でこの結論が確認されます:
<?php var_dump('01' == 1); ?>
上記のコードの出力結果は次のとおりです: bool( true)
そのため、文字列を比較する場合は、 === 演算子を使用して文字列を厳密にチェックするか、起こり得る問題を回避するために strcmp() などの関数を使用することをお勧めします。
さらに、一般的に使用されるin_array()関数にも弱い型の問題があります。次のコードを参照してください:
<?php var_dump(in_array('01', array('1'))); ?>
上記のコードの出力結果は次のとおりです: bool(true)
この PHP を使用したことがありますか。関数のセキュリティ チェックを実行する PHP プログラマは、これがどのような種類のセキュリティ問題を引き起こすかを知っていますよね?幸いなことに、in_array() 関数は 3 番目のパラメーターを提供します。これを true に設定すると、次のコードに示すように、in_array() 関数の必須の型チェック メカニズムをオンにすることができます。
<?php var_dump(in_array('01', array('1'), true)); ?>
出力結果は次のとおりです。 bool(false) PHP は弱い型付け言語であるため、つまり、PHP では
データ型 の概念が弱くなっています。したがって、プログラミング時にデータ型を無視しすぎると (これはほとんどの PHP プログラマーに共通する問題でもあります)、いくつかの問題が発生し、さらにはセキュリティの脆弱性が発生します。最後に、迷惑な格言にあるように、外部データを厳密にチェックしてフィルタリングします。
副作用
$a = '212345678912000005'; $b = '212345678912000001'; var_dump($a == $b);このコードの出力は bool(true) です。これは、この判断により、in_array() 関数の 3 番目のパラメーターが false の場合に、この 2 つが等しいと結論付けられることを意味します。その理由は、まず文字列が数値であるかどうかを判断し、次にそれをlongまたはdouble (
C言語データ型)に変換してから判断するためです - ただし、ソースコードのコメントには次のように書かれています。ステートメントはオーバーフロー状況を考慮しています
} else if (dval1 == dval2 && !zend_finite(dval1)) { /* Both values overflowed and have the same sign, * so a numeric comparison would be inaccurate */ goto string_cmp; }dval1 と dval2 は 2 つの文字列を double 型に変換した後の値ですが、なぜまだこのようになっていますか?
解決策としては、2 つの等号 " の代わりに 3 つの等号 "===" を使用してください。 ==、in_array() 関数によって設定されます。 3 番目のパラメーターは true: in_array('val', $array, true) です。
以上がPHP の == 演算子の文字列比較の使用法とその副作用の例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。