Opcjonalność break w PHP
Polecenie break jest opcjonalne.
Bez niego jednak zachowanie bloków case
będzie nieoczekiwane. Spójrzmy na przykład.
Załóżmy, że mamy taki kod:
<?php
$num = 1;
switch ($num) {
case 1:
echo 1;
break;
case 2:
echo 2;
break;
case 3:
echo 3;
break;
}
?>
Usuńmy w nim wszystkie break, a do zmiennej
$num na początek wpiszmy liczbę 3.
Na razie wszystko będzie działać tak, jak działało:
<?php
$num = 3; // niech tutaj będzie liczba 3
switch ($num) {
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
}
// Po uruchomieniu kod wypisze 3 - wszystko w porządku
?>
Spróbujmy teraz do zmiennej $num wpisać
liczbę 2. W tym przypadku wykona się, zgodnie z oczekiwaniami,
case 2, a potem nieoczekiwanie
również case 3:
<?php
$num = 2;
switch ($num) {
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
}
// Po uruchomieniu kod wypisze 2, a potem 3
?>
Jeśli zaś do zmiennej $num wpiszemy
liczbę 1, to wykonają się w ogóle wszystkie
konstrukcje case:
<?php
$num = 1;
switch ($num) {
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
}
// Po uruchomieniu kod wypisze 1, potem 2, a potem 3
?>
Czyli okazuje się, że przy braku break
po wykonaniu zamierzonego case,
wykonają się również wszystkie case poniżej niego. Czasami
tę cechę wykorzystuje się, przy rozwiązywaniu zadań.
W następnym przykładzie, jeśli zmienna $num
ma wartość 1 lub 2, to
do zmiennej $res zostanie wpisane 'a'.
Jeśli zaś zmienna $num ma wartość
3, to do zmiennej $res
zostanie wpisane 'b':
<?php
$num = 1;
switch ($num) {
case 1:
case 2:
$res = 'a';
break;
case 3:
$res = 'b';
break;
}
echo $res;
?>
Powyżej napisałem, że czasami tę cechę wykorzystuje się, ale ja, ogólnie rzecz biorąc, nie polecam jej używać, ponieważ kod staje się nie zbyt oczywisty.
Oczywistsze jest rozwiązanie takiego zadania przez ify:
<?php
$num = 1;
if ($num == 1 or $num == 2) {
$res = 'a';
}
if ($num == 3) {
$res = 'b';
}
echo $res;
?>