L'optionalité de break en PHP
L'instruction break est optionnelle.
Cependant, sans elle, le comportement des blocs case
sera inattendu. Regardons un exemple.
Supposons que nous ayons le code suivant :
<?php
$num = 1;
switch ($num) {
case 1:
echo 1;
break;
case 2:
echo 2;
break;
case 3:
echo 3;
break;
}
?>
Supprimons tous les break, et dans la variable
$num, enregistrons pour commencer le nombre 3.
Pour l'instant, tout fonctionnera comme avant :
<?php
$num = 3; // supposons le nombre 3 ici
switch ($num) {
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
}
// Après l'exécution, le code affichera 3 - tout va bien
?>
Maintenant, enregistrons dans la variable $num
le nombre 2. Dans ce cas, le case 2
sera exécuté comme prévu, puis, de manière inattendue,
case 3 le sera également :
<?php
$num = 2;
switch ($num) {
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
}
// Après l'exécution, le code affichera 2, puis 3
?>
Si, en revanche, nous enregistrons dans la variable $num
le nombre 1, alors absolument toutes les
structures case seront exécutées :
<?php
$num = 1;
switch ($num) {
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
}
// Après l'exécution, le code affichera 1, puis 2, puis 3
?>
Autrement dit, il s'avère qu'en l'absence de break,
après l'exécution du case prévu,
tous les case en dessous de lui seront également exécutés. Parfois,
cette particularité est utilisée pour résoudre des problèmes.
Dans l'exemple suivant, si la variable $num
a la valeur 1 ou 2, alors
la valeur 'a' sera enregistrée dans la variable $res.
Si la variable $num a la valeur
3, alors la valeur 'b' sera
enregistrée dans la variable $res :
<?php
$num = 1;
switch ($num) {
case 1:
case 2:
$res = 'a';
break;
case 3:
$res = 'b';
break;
}
echo $res;
?>
Plus haut, j'ai écrit que parfois cette particularité est utilisée, mais en général, je ne recommande pas de l'utiliser, car le code devient peu évident.
Il est plus évident de résoudre un tel problème avec des conditions if :
<?php
$num = 1;
if ($num == 1 or $num == 2) {
$res = 'a';
}
if ($num == 3) {
$res = 'b';
}
echo $res;
?>