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
$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
$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
$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
$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
$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
$num = 1;
if ($num == 1 or $num == 2) {
$res = 'a';
}
if ($num == 3) {
$res = 'b';
}
echo $res;
?>