数値型と文字列型の比較で注意したいこと
PHPは状況によって自動で型変換を行ってくれる言語です。
しかし、決して型を意識しなくて良い言語ではありません。
このような処理を行う時、PHPはどのような型変換を行うでしょうか。
$a = '-'; if($a == 0){ echo('zero'); }else{ echo('haihun'); }
結果は「zero」が出力されます。
PHPは文字列型と数値型を比較する際に、文字列型を数値型に変換します。
(僕はずっと逆だと思ってました。。。)
このケースでいうとPHPは '-' を数値型に変換しようとします。
しかし、ハイフンに対応する数値が無いため、 0 になります。
(この、無けりゃ0に変換するよっていうのがPHPの仕様らしいです。)
よって ($a == 0) はTRUEと評価されてしまうのです。
$a = 'sasakure';
とした場合も 0 になります。
$a = '1abc';
の場合は 1 となったりします。
詳しく知りたい方はこちらを参照してください。
ただし、覚えておきたいのは数値型の何に変換されるかではなくて、こんな比較をしてはいけないという事です。
下記のように比較する事で危険な処理を回避しましょう。
$a = '-'; if($a === 0){ echo('zero'); }else{ echo('haihun'); }
「===」は値だけではなく、型についても比較します。
この場合は文字列型と数値型というだけでFALSEと評価します。
$a = '0'; if($a === 0){ echo('zero'); }else{ echo('haihun'); }
値は同じですが、型が異なるので
こちらもFALSEと評価され、「haihun」が出力されます。
ケースによってはstr_cmpを使うのもいいかもしれません。
$a = '-'; if(str_cmp($a,0) == 0){ echo('zero'); }else{ echo('haihun'); }