Breakin valinnaisuus PHP:ssä

Komento break on valinnainen. Ilman sitä case -lohkojen käyttäytyminen on kuitenkin odottamatonta. Katsotaanpa esimerkkiä. Oletetaan, että meillä on seuraava koodi:

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

Poistetaan siitä kaikki break, ja muuttujaan $num aluksi numero 3.

Toistaiseksi kaikki toimii kuten ennenkin:

php<?php
  $num = 3; // oletetaan, että tässä on numero 3
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Suorituksen jälkeen koodi tulostaa 3 - kaikki hyvin
?>

Kirjoitetaan nyt muuttujaan $num numero 2. Tässä tapauksessa odotetusti suoritetaan case 2, ja sitten odottamatta myös case 3:

php<?php
  $num = 2;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Suorituksen jälkeen koodi tulostaa 2 ja sitten 3
?>

Jos muuttujaan $num kirjoitetaan numero 1, niin kaikki case -rakenteet suoritetaan:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // Suorituksen jälkeen koodi tulostaa 1, sitten 2 ja sitten 3
?>

Eli käy ilmi, että kun break puuttuu, suunnitellun case:n suorituksen jälkeen, suoritetaan myös kaikki sen alapuolella olevat case:t. Joskus tätä ominaisuutta hyödynnetään ongelmien ratkaisemisessa.

Seuraavassa esimerkissä, jos muuttujan $num arvo on 1 tai 2, niin muuttujaan $res kirjoitetaan 'a'. Jos taas muuttujan $num arvo on 3, niin muuttujaan $res kirjoitetaan 'b':

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

Yllä kirjoitin, että joskus tätä ominaisuutta käytetään, mutta en yleisesti ottaen suosittele sitä käyttämään, koska koodista tulee epäselvää.

On selvempi ratkaista tällainen tehtävä if-lauseilla:

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