ホームページ >バックエンド開発 >PHPチュートリアル >PHP が遭遇する可能性のある落とし穴 2
先ほど、PHP が陥る可能性のある落とし穴 1 について説明しました。この記事では、PHP が陥る可能性のある落とし穴 2 について説明します。
PHP の実際の開発プロセスで遭遇したいくつかの落とし穴は、私の理解不足が原因でした。落とし穴にはまったとき、本当に泣き出しました。
整数と文字列の比較については、他の人のために一度修正したことがありますが、結局自分が陥りたくなかったので、そうならないように書き留めました。また!
この例を直接見てみましょう:
<?php $foo = 0; $bar = 'a3b4c5'; if ( $foo < $bar ) { echo 'output'; }
答えは「いいえ」です。なぜですか?数値を文字列と比較する場合、文字列は数値に変換されるため、整数に変換する関数 intval( $bar ) を呼び出すと、その値は 0 であることがわかります。 0より大きくなることはありません。 $barの値が'3a4b5c'の場合、数値に変換された文字列の値は3なので結果が出力されます。特定の変換ルールについては、PHP を参照してください。 Manual:
http://us2.php.net/manual/zh/ language.types.string.php# language.types.string.conversion
実際、 $foo が '' に初期化されている場合, 2つの文字列を比較しても間違いはありません。
別のピットを見てみましょう:
if ( $foo == 'a1b2c3' ) { echo 'output'; }
今度は輸出されるでしょうか?答えは「はい」です。理由は実際には上記と同じで、「a1b2c3」は比較中に暗黙的に 0 に型変換されます。
上記の問題の解決策は、暗黙の型変換を行わずに同じ型の 2 つの数値を比較することに他なりません。このとき、3 つの数値が等しいため、合同記号 (===) が登場します。数値は値だけでなく型も比較します。また、文字列を比較する場合、strcmp()関数を使用すると、この問題は発生しません。
別の例:
$checkedKeys = array('someKey1', 'someKey2');
$arrTest = array('someKey1' => 'someValue', 'otherValue');
foreach ($arrTest as $key => $value)
{
if (in_array($key, $checkedKeys))
{
echo "The key valid: $key \n";
}
}
同様に、ここでは2つの出力があり、2回目の$key出力は0です。理解できますか?解決策は、in_array() 関数に 3 番目のパラメーターを追加して true に設定し、厳密な型比較を実行することです。ドキュメントは http://php.net/manual/zh/function.in-array.php
にあります。
PHP 言語の大きな利点の 1 つはその柔軟性ですが、これは慎重かつ慎重に書かれていないコードには隠れた危険性ももたらします。
関連する推奨事項:
以上がPHP が遭遇する可能性のある落とし穴 2の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。