A opcionalidade do break em PHP

A instrução break é opcional. No entanto, sem ela, o comportamento dos blocos case será inesperado. Vamos ver um exemplo. Suponha que temos o seguinte código:

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

Vamos remover todos os break e, para começar, atribuir o número 3 à variável $num.

Por enquanto, tudo funcionará como antes:

php<?php
  $num = 3; // vamos supor o número 3 aqui
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Após a execução, o código exibirá 3 - tudo certo
?>

Agora, vamos atribuir o número 2 à variável $num. Neste caso, o case 2 será executado conforme o esperado, e então, inesperadamente, o case 3 também será executado:

php<?php
  $num = 2;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Após a execução, o código exibirá 2 e depois 3
?>

Se atribuirmos o número 1 à variável $num, então todos os case serão executados:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Após a execução, o código exibirá 1, depois 2 e depois 3
?>

Ou seja, acontece que na ausência de break, após a execução do case planejado, todos os case abaixo dele também serão executados. Às vezes essa característica é utilizada na resolução de problemas.

No exemplo a seguir, se a variável $num tiver o valor 1 ou 2, então o valor 'a' será atribuído à variável $res. Se a variável $num tiver o valor 3, então o valor 'b' será atribuído à variável $res:

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

Como mencionado anteriormente, às vezes essa característica é utilizada, mas eu, de modo geral, não recomendo usá-la, pois o código se torna pouco óbvio.

É mais claro resolver esse tipo de problema usando ifs:

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