2007/02/12

phpのswitchでハマる

php5.1.6でハマった。


phpのswitchでは文字列を使用できる(今どき珍しくも無いけど)ので重宝するのだけど、phpのswitchで0を評価して初めのcaseが文字列だと文字列の内容が何であれ条件にマッチしてしまう。



$var = 0;
switch ($var) {
case "a":
echo "a";
break;
case 0:
echo "0";
break;
case 1:
echo "1";
break;
}

これはaと表示される。switchで評価する値が1だったり、初めの条件の型が数値だと問題ないんだけど。


switchというと数値評価が基本の気がしてしまうけど、文字列にキャストした方が無難だ。



$var = 0;//無論"0"としても良い
switch ((string)$var) {
case "a":
echo "a";
break;
case 0:
echo "0";
break;
case 1:
echo "1";
break;
}

これで0と表示される。


ちなみにcaseの方を"0"にしても、評価値が0なら初めのcaseが文字列なら該当してしまう。