ホームページ > バックエンド開発 > PHPチュートリアル > PHP が遭遇する可能性のある落とし穴 2

PHP が遭遇する可能性のある落とし穴 2

小云云
リリース: 2023-03-21 17:44:01
オリジナル
1280 人が閲覧しました

先ほど、PHP が陥る可能性のある落とし穴 1 について説明しました。この記事では、PHP が陥る可能性のある落とし穴 2 について説明します。

PHP の実際の開発プロセスで遭遇したいくつかの落とし穴は、私の理解不足が原因でした。落とし穴にはまったとき、本当に泣き出しました。

整数と文字列の比較については、他の人のために一度修正したことがありますが、結局自分が陥りたくなかったので、そうならないように書き留めました。また!

この例を直接見てみましょう:

<?php
$foo = 0;
$bar = &#39;a3b4c5&#39;;
if ( $foo < $bar ) {
    echo &#39;output&#39;;
}
ログイン後にコピー

答えは「いいえ」です。なぜですか?数値を文字列と比較する場合、文字列は数値に変換されるため、整数に変換する関数 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 == &#39;a1b2c3&#39; ) {
    echo &#39;output&#39;;
}
ログイン後にコピー

今度は輸出されるでしょうか?答えは「はい」です。理由は実際には上記と同じで、「a1b2c3」は比較中に暗黙的に 0 に型変換されます。

上記の問題の解決策は、暗黙の型変換を行わずに同じ型の 2 つの数値を比較することに他なりません。このとき、3 つの数値が等しいため、合同記号 (===) が登場します。数値は値だけでなく型も比較します。また、文字列を比較する場合、strcmp()関数を使用すると、この問題は発生しません。

別の例:

$checkedKeys = array(&#39;someKey1&#39;, &#39;someKey2&#39;);
$arrTest = array(&#39;someKey1&#39; => &#39;someValue&#39;, &#39;otherValue&#39;);
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 が陥る可能性のあるピット 1

以上がPHP が遭遇する可能性のある落とし穴 2の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート