Neobveznost break v PHP

Ukaz break je neobvezen. Brez njega pa bo vedenje blokov case nenavadno. Poglejmo si na primeru. Recimo, da imamo takšno kodo:

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

Odstranimo vse break, v spremenljivko $num pa za začetek zapišimo številko 3.

Za zdaj bo vse delovalo tako kot prej:

php<?php
  $num = 3; // naj bo tukaj številka 3
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Po zagonu bo koda izpisala 3 - vse je v redu
?>

Poskusimo zdaj v spremenljivko $num zapisati številko 2. V tem primeru se bo pričakovano izvedel case 2, nato pa še nepričakovano tudi case 3:

php<?php
  $num = 2;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Po zagonu bo koda izpisala 2 in nato 3
?>

Če pa v spremenljivko $num zapišemo številko 1, se bodo izvedle vse konstrukcije case:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Po zagonu bo koda izpisala 1, nato 2 in nato 3
?>

Se pravi, če ni break, se po izvedbi načrtovanega case, izvedejo tudi vsi case pod njim. Včasih to lastnost uporabimo pri reševanju problemov.

V naslednjem primeru, če ima spremenljivka $num vrednost 1 ali 2, se v spremenljivko $res zapiše 'a'. Če pa ima spremenljivka $num vrednost 3, se v spremenljivko $res zapiše 'b':

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

Zgoraj sem napisal, da včasih to lastnost uporabimo, vendar na splošno ne priporočam njeno uporabe, saj koda postane ne zelo očitna.

Bolj očitno je tak problem rešiti z if stavki:

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