Valfriheten av break i PHP

Kommandot break är valfritt. Utan det kommer dock beteendet hos blocken case att bli oväntat. Låt oss titta på ett exempel. Anta att vi har följande kod:

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

Låt oss ta bort alla break i den, och i variabeln $num till att börja med skriva in talet 3.

För tillfället kommer allt att fungera som det gjorde:

php<?php
  $num = 3; // låt oss säga att det är 3 här
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Efter uppstart kommer koden att skriva ut 3 - allt är bra
?>

Låt oss nu i variabeln $num skriva talet 2. I det här fallet kommer vår förväntade case 2 att utföras, och sedan oväntat även case 3:

php<?php
  $num = 2;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Efter uppstart kommer koden att skriva ut 2 och sedan 3
?>

Om vi däremot i variabeln $num skriver talet 1, kommer alla konstruktioner case att utföras:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Efter uppstart kommer koden att skriva ut 1, sedan 2 och sedan 3
?>

Det visar sig alltså att i avsaknad av break, efter exekvering av den avsedda case, kommer även alla case under den att exekveras. Ibland används denna egenskap när man löser problem.

I följande exempel, om variabeln $num har värdet 1 eller 2, så kommer 'a' att skrivas in i variabeln $res. Om variabeln $num däremot har värdet 3, så kommer 'b' att skrivas in i variabeln $res:

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

Ovan skrev jag att denna egenskap ibland används, men jag rekommenderar i allmänhet inte att använda den, eftersom koden blir inte särskilt uppenbar.

Det är mer uppenbart att lösa ett sådant problem med if-satsar:

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