[PHP-Tips] 比較を行う際の落とし穴
比較(==, !=, if, switch, in_array など)を行う際、大きな落とし穴が存在します。 例えば、まず以下のコードを実行した際、何が表示されるか考えてみてください。
<? $str = "php"; if ($str == 0) { print "正"; } else { print "誤"; } ?>
「誤」が表示されると思いますよね。 「正」が表示されると思った人は正解です。既に落とし穴にはまった人ですか? < 実行結果 > このエラーに遭遇したときは、頭の上は疑問符だらけになるかと思います。 なぜこのような結果になるのでしょうか? PHPマニュアルの 比較演算子 を見てみると
整数値を文字列と比較する際、文字列が 数値に変換されます。 数値形式の文字列を比較する場合、それは整数として比較されます。
と書かれています。 そして、文字列から数値への変換は次のような定義で行われます。
文字列の数値への変換 数値として文字列が評価された時、結果の値と型は次のように定義されます。 文字列は、'.'、'e'、'E' のどれかが含まれている場合は float、それ以外は整数として評価されます。 文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。有効な数値データは符号(オプション)の後に、 1 つ以上の数字 (オプションとして小数点を 1 つ含む)、 オプションとして指数部が続きます。指数部は 'e' または 'E' の後に 1 つ以上の数字が続く形式です。
条件を踏まえた上で、次のコードを確認しておきましょう。
<?php var_dump(0 == "a"); // 0 == 0 -> true var_dump("1" == "01"); // 1 == 1 -> true var_dump("1" == "1e0"); // 1 == 1 -> true switch ("a") { case 0: echo "0"; break; case "a": // "a" は 0 にマッチするので、決してここにはたどりつきません echo "a"; break; } ?>
まぁ「数値と文字列の比較を行う際、文字列は数値に暗黙の型変換が行われる」と覚えてしまえば良いのではないでしょうか。
「PHP プログラミング」に関する「本」の商品を自動的に表示しています。
キーワードに関連していない商品は、Amazonがオススメする商品です。気になる物があればどうぞ。
キーワードに関連していない商品は、Amazonがオススメする商品です。気になる物があればどうぞ。
作成日:2008年07月18日(Fri)