2007年8月25日 土曜日 2:53:52

PHPで文字列の比較を行う場合の注意

メモ,プログラム,php,WEB開発 [ by Mizugame ]

20070825.jpg
本当はPHPのメリットのはずなんだけど、開発する側の混乱の元になる自動型変換。
それにしても、これは無いよなーってところをメモ。

この辺りはおさらいするまでも無いんだけど、普通に便利そうで結構迷惑なところ。

<?php var_dump(false == 0); //bool(true) ?>
<?php var_dump(null == 0); //bool(true) ?>

まぁ、ここは比較演算子を「===」に変えればすむのでとりあえず。
・・・ただこっちは結構厄介。

<?php var_dump(“string” == 0); //bool(true) ?>

むぅ、これはちょっと・・・。

なんか仕様を通り越して悪意すら感じる。
とりあえず文字列型で無理やり固定してしまって

<?php var_dump(“string” === (string)0); //bool(false) ?>
<?php var_dump(“string” === “0″); //bool(false) ?>

なんかで対応しても良いんだけど、結構めんどくさいので

<?php var_dump(strcmp(“string”, 0) == 0); //bool(false) ?>

のように、strcmp関数で対応するのが良いみたい。

比較演算子で書くのが慣れてしまっているようなら、厳密に型比較で「===」をつかえば良いのかな?

<?php var_dump((bool)0); //bool(false) ?>
<?php var_dump((bool)1); //bool(true) ?>

のようなこともあるので、極めて厳密な処理にはならない。

比較演算子+型固定にしてもstrcmp関数を使うにしても「true」と「1」や「false」と「0」の比較は通ってしまうので、論理型 (boolean) の比較が必要な場合は分けないと仕方が無いか。

なかなか、面倒ではあるけど大事な処理なので。
・・・頭が痛くなる。

ちなみにfloat型とかを(int)で型指定した時点で整数に戻せる辺りで、もしやと思ったけど

<?php var_dump(“1string” == 1); //bool(true) ?>

・・・やっぱり。
結構変な比較が通ってしまうようですね。

しかも仕様らしいし。
参考情報:
PHP- 文字列 – Manual

文字列、数値比較の内容の実行結果がわかりにくかったので、実行結果だけでまとめてみました。
phpの文字、数値の比較関連、実行結果をずらっと一覧にした。

コメント (0) »