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

Команда break является необязательной. Без нее, однако, поведение блоков case будет неожиданным. Давайте посмотрим на примере. Пусть у нас есть вот такой код:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    break;
    case 2:
      echo 2;
    break;
    case 3:
      echo 3;
    break;
  }
?>

Уберем в нем все break, а в переменную $num для начала запишем число 3.

Пока все будет работать так, как и работало:

php<?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<?php
  $num = 2;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // После запуска код выведет 2, а затем 3
?>

Если же в переменную $num записать число 1, то вообще выполнятся все конструкции case:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // После запуска код выведет 1, затем 2, а затем 3
?>

To есть получается, что при отсутствии break после выполнения задуманного case, выполнятся и все case ниже него. Иногда такую особенность используют, при решении задач.

В следующем примере, если переменная $num имеет значение 1 или 2, то в переменную $res запишется 'a'. Если же переменная $num имеет значение 3, то в переменную $res запишется 'b':

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
    case 2:
      $res = 'a';
    break;
    case 3:
      $res = 'b';
    break;
  }
  
  echo $res;
?>

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

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

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