Break-i mittekohustuslikkus PHP-s

Käsk break on mittekohustuslik. Ilma selleta on aga plokkide case käitumine ootamatu. Vaatame näite peal. Olgu meil selline kood:

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

Eemaldame sellest kõik break-id, ja muutujasse $num paneme alustuseks numbri 3.

Alguses töötab kõik nagu ennegi:

php<?php
  $num = 3; // olgu siin number 3
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Pärast käivitamist kood väljastab 3 - kõik korras
?>

Paneme nüüd muutujasse $num numbri 2. Sel juhul käivitatakse ootuspäraselt case 2, ja siis ootamatult ka case 3:

php<?php
  $num = 2;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Pärast käivitamist kood väljastab 2 ja siis 3
?>

Kui muutujasse $num panna number 1, siis käivituvad üldse kõik konstruktsioonid case:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Pärast käivitamist kood väljastab 1, siis 2 ja siis 3
?>

See tähendab, et break-i puudumisel pärast soovitud case täitmist käivituvad ka kõik case-id allpool seda. Mõnikord kasutatakse seda omadust ülesannete lahendamisel.

Järgmises näites, kui muutuja $num omab väärtust 1 või 2, siis muutujasse $res kirjutatakse 'a'. Kui muutuja $num omab väärtust 3, siis muutujasse $res kirjutatakse 'b':

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

Eespool ma kirjutasin, et mõnikord kasutatakse seda omadust, kuid üldiselt ma ei soovita seda kasutada, sest kood muutub mitte väga ilmseks.

Ilmsem on selline ülesanne lahendada if-ide abil:

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