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が文字列なら該当してしまう。