Неабавязковасць 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
?>

Гэта значыць атрымліваецца, што пры адсутнасці 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;
?>