[PHP]簡易比較でおちいりやすい罠_その2

Read More

以前に比較式について書いたことがあるけど今回はその続き。


以前の記事:[PHP]簡易比較でおちいりやすい罠
http://xirasaya.com/?m=detail&hid=266


--
一つ例を出す。

以下のような処理を実行した場合、画面に表示されるのは1か0か?

■例1
<?php
$var = 'test';
if($var==0) {
    echo 1;
} else {
    echo 0;
}// end if
?>



'test'と0は等価ではないのでtrueにならない。
だから0が表示される、と考えてしまうかもしれない。




しかし実行結果は以下の通り。

■例1の実行結果
> 1


これは、PHPでは数値と文字列の比較を行った場合、文字列側の方を数値として変換して比較する仕様だから。


文字列を数値に変換する流れはこんな感じ。
・一番左の文字から順に数値に変換していく。
・最初の文字が数値にできる文字で、次の文字が数値にできない文字だったら最初の文字だけを数値として返す。
・最初の文字が数値にできない文字だった場合0として扱う。

だったはず。たぶん。

■文字列から数値への変換例
'567'   => 567
'5abc' => 5
'abc'   => 0




さて先ほどの例1を視覚的にわかりやすく書くと以下のようになる。
注!ダメな例です!
<?php
$var = 'test';
if(intval($var)==0) {
    echo 1;
} else {
    echo 0;
}// end if
?>



こうやって書きなおすと実行結果も理解できると思うが、わりと陥りやすい罠かも知れない。



結論的には、
比較には厳密な型の比較ができる===演算子を使うべき、ってこと。




--
[PHP]簡易比較でおちいりやすい罠
http://xirasaya.com/?m=detail&hid=266


[PHP]簡易比較でおちいりやすい罠_その3
http://xirasaya.com/?m=detail&hid=521





Comments(3)

1  115ちゃん  2012/06/01 (金) 12:10 ID:XXXXXXXXX
>以下のような処理を実行した場合、画面に表示されるのは1か0か?

普通に0って言ってました。。。
残念な結果。。。

↑分かりやすい説明ありがとうございます!!!!!

2  びるぱん  2012/06/15 (金) 01:19 ID:XXXXXXXXX
比較には===を使うって習った。

3  シラサヤ  2012/06/15 (金) 14:41 ID:XXXXXXXXX
データ型の比較まで行うヤツね。
それが一番なんだろーね。