L'opzionalità di break in PHP

Il comando break è opzionale. Tuttavia, senza di esso, il comportamento dei blocchi case sarà inaspettato. Diamo un'occhiata a un esempio. Supponiamo di avere il seguente codice:

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

Rimuoviamo tutti i break e, per cominciare, inseriamo il numero 3 nella variabile $num.

Inizialmente, tutto funzionerà come prima:

php<?php
  $num = 3; // supponiamo che qui ci sia il numero 3
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Dopo l'esecuzione, il codice mostrerà 3 - tutto bene
?>

Ora inseriamo il numero 2 nella variabile $num. In questo caso, verrà eseguito case 2 come previsto, e poi, inaspettatamente, anche case 3:

php<?php
  $num = 2;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Dopo l'esecuzione, il codice mostrerà 2, e poi 3
?>

Se invece inseriamo il numero 1 nella variabile $num, verranno eseguite tutte le strutture case:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Dopo l'esecuzione, il codice mostrerà 1, poi 2 e poi 3
?>

Quindi, in assenza di break, dopo l'esecuzione del case previsto, verranno eseguiti anche tutti i case successivi. A volte questa caratteristica viene utilizzata per risolvere problemi.

Nel seguente esempio, se la variabile $num ha valore 1 o 2, nella variabile $res verrà scritto 'a'. Se invece la variabile $num ha valore 3, nella variabile $res verrà scritto 'b':

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

In precedenza ho scritto che a volte questa caratteristica viene utilizzata, ma in generale, non raccomando di usarla, poiché il codice diventa poco chiaro.

È più ovvio risolvere un problema del genere con gli if:

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