2007年8月25日 土曜日 2:53:52
PHPで文字列の比較を行う場合の注意
![]()
本当は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の文字、数値の比較関連、実行結果をずらっと一覧にした。
トラックバック URL :
コメント (0)