php switch文のstring比較に気をつけろ

phpのゆるふわ型比較で引っかかった話

常識なのかもしれませんが、 普段GOとかJavaとか使ってた自分にとってこんなに理不尽なことはないと思ったので書きたい。

暗黙の型変換怖い・・・

事象

$array = [
    'test', 0,
];

foreach ($array as $value) {
    switch ($value) {
        case 'test':
       echo('test!');
             break;
        default:
             echo('default!');
    }
}

結果

test!test!

はい。こうなります。やめて・・・

っていうのも型比較がゆるいかららしい。

解決策

foreach ($array as $value) {
    $stringValue = is_string($value) ? $value : (string)$value
    switch ($stringValue) {
        case 'test':
       echo('test!');
             break;
        default:
             echo('default!');
    }
}

ひとまず、型変換したら通ったよ...


みなさんもゆるふわ型変換には気を付けよう。