ROUTE 3390

備忘録的な用途で書いていますが、どなたかの役に立つ事があれば嬉しいです。

数値型と文字列型の比較で注意したいこと

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');
}