Manuel PHP
Précédent | Chapitre 16. Les structures de contrôle | Suivant

# `switch`

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 que `break`. Si vous avez un `switch` dans une boucle, et que vous souhaitez continuer jusqu'à la prochaine itération de la boucle extérieure, vous vous devez utiliser `continue 2`.

Les deux exemples suivants sont deux manières différentes d'écrire la même chose, l'une en utilisant une séries de `if`, et l'autre en utilisant l'instruction `switch` :

Exemple 16-23. Instruction `switch`

`<?php if ($i == 0) { echo "i égale 0"; } elseif ($i == 1) { echo "i égale 1"; } elseif ($i == 2) { echo "i égale 2"; } switch ($i) { case 0: echo "i égale 0"; break; case 1: echo "i égale 1"; break; case 2: echo "i égale 2"; break; } ?>`

Exemple 16-24. Instruction `switch` utilisant une chaîne de caractères

`<?php switch ($i) { case "tarte": echo "i est une tarte"; break; case "barre": echo "i est une barre"; break; case "gateau": echo "i est un gateau"; break; } ?>`

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é. Seulement lorsqu'un `case` est vérifié, PHP exécute alors les instructions correspondantes. PHP continue 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 :

Exemple 16-25. Instruction `switch` et `fall through`

`<?php switch ($i) { case 0 : echo "i égale 0"; case 1 : echo "i égale 1"; case 2 : echo "i égale 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'affiche 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.

Exemple 16-26. Instruction `switch` et cas vide

`<?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 égale 3"; } ?>`

Un `case` spécial est `default`. Ce cas est utilisé lorsque tous les `case` ont échoués. Il doit être le dernier cas listé. Par exemple :

Exemple 16-27. Instruction `switch` et `default`

`<?php switch ($i) { case 0: echo "i égale 0"; break; case 1: echo "i égale 1"; break; case 2: echo "i égale 2"; break; default: echo "i n'est ni égal à 2, ni à 1, ni à 0."; } ?>`

Une autre chose à mentionner est que la valeur du `case` peut être toute expression de type scalaire, c'est-à-dire nombre entier, nombre à virgule flottante et chaîne de caractères. Les tableaux sont sans intérêt dans ce contexte-là.

La syntaxe alternative pour cette structure de contrôle est la suivante : pour plus d'informations, voir syntaxes alternatives).

Exemple 16-28. Instruction `switch` alternative

`<?php switch ($i): case 0: echo "i égale 0"; break; case 1: echo "i égale 1"; break; case 2: echo "i égale 2"; break; default: echo "i n'est ni égal à 2, ni à 1, ni à 0"; endswitch; ?>`

Précédent | Sommaire | Suivant
`continue` | Niveau supérieur | `declare`