(PHP 4, PHP 5, PHP 7, PHP 8)
L'instruction switch
équivaut à une série d'instructions
if
. En de nombreuses occasions, vous aurez besoin de
comparer la même variable (ou expression) avec un grand nombre de valeurs
différentes, et d'exécuter différentes parties de code suivant la valeur
à laquelle elle est égale. C'est exactement à cela que sert l'instruction
switch
.
Note: Notez que contrairement à d'autres langages, la structure continue s'applique aux structures
switch
et se comporte de la même manière quebreak
. Si vous avez unswitch
dans une boucle, et que vous souhaitez continuer jusqu'à la prochaine itération de la boucle extérieure, vous devez utilisercontinue 2
.
Note:
Notez que switch/case provoque une comparaison large.
Dans l'exemple suivant, chaque bloc de code est équivalent.
L'un utilise une série d'instructions if
et
elseif
, et l'autre une instruction de type
switch
. Dans chaque cas, la sortie est la même.
Exemple #1 Instruction switch
<?php
// Ce switch:
switch ($i) {
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
}
// Équivaut à:
if ($i == 0) {
echo "i égal 0";
} elseif ($i == 1) {
echo "i égal 1";
} elseif ($i == 2) {
echo "i égal 2";
}
?>
Il est important de comprendre que l'instruction
switch
exécute chacune des
clauses dans l'ordre. L'instruction switch
est exécutée ligne par ligne. Au début,
aucun code n'est exécuté. Uniquement lorsqu'une instruction
case
est trouvée dont
l'expression est évaluée à une valeur qui correspond à la valeur de
l'expression switch
, PHP exécute alors les instructions correspondantes.
PHP continu d'exécuter les instructions jusqu'à
la fin du bloc d'instructions du switch
,
ou bien dès qu'il trouve l'instruction break
.
Si vous ne pouvez pas utiliser l'instruction
break
à la fin de l'instruction
case
, PHP continuera à exécuter
toutes les instructions qui suivent. Par exemple :
<?php
switch ($i) {
case 0:
echo "i égal 0";
case 1:
echo "i égal 1";
case 2:
echo "i égal 2";
}
?>
Dans cet exemple, si $i est égal à 0, PHP va
exécuter quand même toutes les instructions qui
suivent! Si $i est égal à 1, PHP exécutera
les deux dernières instructions. Et seulement si $i est
égal à 2, vous obtiendrez le résultat
escompté, c'est-à-dire, l'affichage de
"i égal 2". Donc, l'important est de ne pas oublier
l'instruction break
(même s'il est
possible que vous l'omettiez dans certaines circonstances).
Dans une commande switch
, une condition n'est
évaluée qu'une fois, et le résultat est
comparé à chaque case
.
Dans une structure elseif
, les conditions sont
évaluées à chaque comparaison. Si votre
condition est plus compliquée qu'une simple
comparaison, ou bien fait partie d'une boucle,
switch
sera plus rapide.
La liste de commandes d'un case
peut
être vide, auquel cas PHP utilisera la liste de
commandes du cas suivant.
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i est plus petit que 3 mais n'est pas négatif";
break;
case 3:
echo "i égal 3";
}
?>
Un cas spécial est default
. Ce cas est utilisé lorsque tous
les autres cas ont échoué. Par exemple :
<?php
switch ($i) {
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
default:
echo "i n'est ni égal à 2, ni à 1, ni à 0.";
}
?>
Note: Plusieurs cas default lèveront une erreur de niveau
E_COMPILE_ERROR
.
Note: Techniquement, le cas
default
peut être placé à n'importe quelle position. Il ne sera utilisé que si aucun autre cas ne correspond. Cependant, par convention, il est préférable de le placer à la fin.
Si aucun case
ne correspond, et qu'il n'y a pas de default
, alors aucun code ne sera exécuté, tout comme si aucune instruction if
n'était vraie.
Une valeur de case
peut être donnée sous forme d'expression. Cependant, cette expression sera
évaluée seule, puis comparée de manière approximative à la valeur du switch
. Cela signifie
qu'elle ne peut pas être utilisée pour des évaluations complexes de la valeur du switch
. Par exemple :
<?php
$target = 1;
$start = 3;
switch ($target) {
case $start - 1:
print "A";
break;
case $start - 2:
print "B";
break;
case $start - 3:
print "C";
break;
case $start - 4:
print "D";
break;
}
// Prints "B"
?>
Pour des comparaisons plus complexes, la valeur true
peut être utilisée comme valeur de switch
.
Ou, alternativement, des blocs if
-else
au lieu de switch
.
<?php
$offset = 1;
$start = 3;
switch (true) {
case $start - $offset === 1:
print "A";
break;
case $start - $offset === 2:
print "B";
break;
case $start - $offset === 3:
print "C";
break;
case $start - $offset === 4:
print "D";
break;
}
// Prints "B"
?>
La syntaxe alternative pour cette structure de contrôle est la suivante : (pour plus d'informations, voir syntaxes alternatives).
<?php
switch ($i):
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
default:
echo "i n'est ni égal à 2, ni à 1, ni à 0";
endswitch;
?>
Il est possible d'utiliser un point-virgule plutôt que deux points après un case, comme ceci :
<?php
switch($beer)
{
case 'leffe';
case 'grimbergen';
case 'guinness';
echo 'Bon choix';
break;
default;
echo 'Merci de faire un choix...';
break;
}
?>