Необязательность break в PHP

Команда 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; ?>

Выше я написал, что иногда такую особенность используют, но я, в общем-то, не рекомендую ей пользоваться, так как код становится не очень очевидным.

Очевиднее решить такую задачу через ифы:

<?php $num = 1; if ($num == 1 or $num == 2) { $res = 'a'; } if ($num == 3) { $res = 'b'; } echo $res; ?>