PHPにおけるbreakの任意性
コマンド break は任意です。
しかし、これがないと case ブロックの
動作は予期しないものになります。例を見てみましょう。
次のようなコードがあるとします:
<?php
$num = 1;
switch ($num) {
case 1:
echo 1;
break;
case 2:
echo 2;
break;
case 3:
echo 3;
break;
}
?>
このコードからすべての break を取り除き、
変数 $num にはまず数字 3 を
代入してみましょう。
今のところ、すべては以前と同様に動作します:
<?php
$num = 3; // ここを数字3とする
switch ($num) {
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
}
// 実行後、コードは 3 を出力します - 問題ありません
?>
次に、変数 $num に数字 2 を
代入してみます。この場合、予想通り
case 2 が実行され、その後、予期せず
case 3 も実行されます:
<?php
$num = 2;
switch ($num) {
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
}
// 実行後、コードは 2、そして 3 を出力します
?>
もし変数 $num に数字 1 を
代入すると、すべての case 構文が
実行されてしまいます:
<?php
$num = 1;
switch ($num) {
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
}
// 実行後、コードは 1、次に 2、そして 3 を出力します
?>
つまり、break が存在しない場合、
意図した case が実行された後、
その下にあるすべての case も実行されてしまうのです。この特性が
問題解決に利用されることもあります。
次の例では、変数 $num の値が
1 または 2 の場合、
変数 $res に 'a' が
代入されます。変数 $num の値が
3 の場合、変数 $res には
'b' が代入されます:
<?php
$num = 1;
switch ($num) {
case 1:
case 2:
$res = 'a';
break;
case 3:
$res = 'b';
break;
}
echo $res;
?>
上記で、この特性が時々使われると書きましたが、 私は、コードが非常に明確ではなくなるため、 基本的にはこの使い方を推奨しません。
このような問題は、if文を使ってより明確に 解決できます:
<?php
$num = 1;
if ($num == 1 or $num == 2) {
$res = 'a';
}
if ($num == 3) {
$res = 'b';
}
echo $res;
?>