PHP:switchブロック case 0 の混在はNG?
少しハマったので。
PHPはcase文に文字列を用いることが出来るが、以下のswitchブロックのように、比較対照を0としたcase文と’x’としたcase文が混在する場合、期待通りに動作しないようである。
以下の例でechoによって出力されるのは、期待に反して’0’である。
$value = ‘x’;
switch ( $value ) {
case 0:
echo 0;
break;
case ‘x’:
echo ‘x’;
break;
default:
break;
}
以下の例でechoによって出力されるのは、’x’である(期待通り)。
$value = ‘x’;
switch ( $value ) {
case ‘x’:
echo ‘x’;
break;
case 0:
echo 0;
break;
default:
break;
}
なお、以下のように0を1に変更して実行すると、期待通り’x’が出力される。
$value = ‘x’;
switch ( $value ) {
case 1:
echo 1;
break;
case ‘x’:
echo ‘x’;
break;
default:
break;
}
よって、型の混在が問題を引き起こしているのではなさそうであるが、マニュアルを読んでもこの件については触れられておらず、少し調べた限りではこの件に関する情報は得られなかった。
ただ、このswitchブロックに達した時、比較対象とする変数が整数型と文字列型のどちらの可能性もあるというのはナンセンスであり、そのようなプログラムを組んではいけない。