switch文を使ってはいけない?

http://blog.tojiru.net/article/403698034.html の記事で、switch文の例として上げられてたコード

<?php
switch (true) {
    case 0:
        echo '数字の0';
        break;
    case '0':
        echo '文字列の0';
        break;
    case '0.0':
        echo '文字列の0.0';
        break;
    case true:
        echo '真偽値のtrue';
        break;
}

これ、配列でテーブル作れば簡潔にかけるんじゃ?と思って試してみた。

<?php
$tbl = array( 
           0 => '数字の0',
         '0' => '文字列の0',
     '0.0' => '文字列の0.0',
     true => '真偽値のtrue');

echo $tbl[0];
echo $tbl['0'];
echo $tbl['0.0'];
echo $tbl[true];
?>

簡潔!素敵!


でも、実はこれ、一部正しく動作しません。実行すると結果は

文字列の0
文字列の0
文字列の0.0
真偽値のtrue

となります。PHP(笑)*1


というわけで、今回のコードは良い例になりませんでしたが、言いたいことをまとめると

  • switch文を書き換える場合は、ポリモーフィズムだけでなく、テーブル(arrayとかhashとかmap)も検討すべき
  • PHPは罠だらけ!

以上です。

*1:何故このような謎な挙動になるのか?気になる人は var_dump($tbl)するか、array のマニュアルを読みましょう。