Volitelnost break v PHP

Příkaz break je volitelný. Bez něj však bude chování bloků case nečekané. Podívejme se na příklad. Předpokládejme, že máme následující kód:

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

Odstraníme z něj všechny break a do proměnné $num pro začátek vložíme číslo 3.

Zatím vše bude fungovat tak, jak fungovalo:

php<?php
  $num = 3; // předpokládejme, že zde je číslo 3
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Po spuštění kód vypíše 3 - vše je v pořádku
?>

Nyní vložme do proměnné $num číslo 2. V tomto případě se očekávaně provede case 2, a poté nečekaně i case 3:

php<?php
  $num = 2;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Po spuštění kód vypíše 2 a poté 3
?>

Pokud do proměnné $num vložíme číslo 1, provedou se všechny konstrukce case:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Po spuštění kód vypíše 1, poté 2 a poté 3
?>

To znamená, že při absenci break po provedení zamýšleného case se provedou i všechny case pod ním. Někdy se tato zvláštnost využívá při řešení úloh.

V následujícím příkladu, pokud proměnná $num má hodnotu 1 nebo 2, pak se do proměnné $res zapíše 'a'. Pokud proměnná $num má hodnotu 3, pak se do proměnné $res zapíše 'b':

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

Výše jsem napsal, že někdy se tato zvláštnost používá, ale obecně ji nedoporučuji používat, protože kód se stává ne příliš zřejmým.

Je zřejmější vyřešit takový problém pomocí ifů:

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