Menu

PHP switch : case, break et passage au cas suivant

switch ($value) compare une valeur à une liste d'étiquettes case et exécute le code depuis la première correspondance jusqu'à un break. Plusieurs cas, passage au cas suivant, default, switch(true), et pourquoi switch utilise la comparaison souple ==.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

switch ($value) compare une valeur à une liste d'étiquettes case et exécute le code situé sous la première étiquette qui correspond. Chaque case se termine par break ; default traite tout ce qui n'a correspondu à rien.

Mettez $day à 'fri', 'sun' ou 'wed' et relancez. Le case default n'a pas besoin de break quand il est le dernier.

Plusieurs cas pour un même bloc

Pour exécuter le même code pour plusieurs valeurs, empilez les étiquettes case sans rien entre elles. Une étiquette qui correspond continue dans le code situé en dessous.

Contrairement à match, un switch n'a pas de syntaxe à virgule case 'jpg', 'jpeg':. Les étiquettes empilées sont le seul moyen.

Le passage au cas suivant : ce qui se passe sans break

C'est break qui arrête un switch. Sans lui, PHP exécute le case qui correspond puis continue dans tous les case situés en dessous, en ignorant leurs étiquettes, jusqu'à un break ou la fin.

Ici, le passage au cas suivant est voulu : chaque offre reçoit ses propres fonctions plus tout ce qu'offrent les formules moins chères. Quand vous l'écrivez volontairement, ajoutez un commentaire comme // no break pour que le prochain lecteur ne le « corrige » pas. Quand ce n'est pas voulu, un break manquant est l'un des bugs de switch les plus courants.

switch utilise la comparaison souple (==)

Chaque case est testé avec ==, pas ===. Une chaîne numérique correspond à un nombre, null correspond à false et à "", et true correspond à toute valeur évaluée à vrai. Touchez les cases pour comparer les deux opérateurs.

switch compare avec ==, match compare avec ===
Point at or tap a cell to read it as PHP.
$a == $b01"0""1"""nullfalsetrue"a""10""1e1"
0
1
"0"
"1"
""
null
false
true
"a"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

La conséquence pratique : une chaîne "1" venant d'un formulaire tombe dans case 1: sans aucune conversion, ce qui est souvent ce que vous voulez. Mais switch (true) avec une chaîne non vide, ou null face à case false:, peut choisir un case inattendu.

Regardez la ligne null : elle n'atteint jamais case false:, car null == 0 est déjà vrai et case 0: vient en premier. Avec la comparaison souple, l'ordre des case change le résultat. Depuis PHP 8, 0 == "a" est faux (en PHP 7, c'était vrai), donc une chaîne non numérique ne correspond plus à case 0:. Si vous avez besoin de ===, utilisez une expression match, présentée à la fin de cette page.

switch(true) pour des plages et des conditions

Une étiquette case peut être n'importe quelle expression. Avec switch (true), chaque case est une condition, et la première qui vaut true l'emporte.

Assurez-vous que chaque case est un vrai booléen. À cause de la comparaison souple, case $name: correspondrait dès que $name est une chaîne non vide.

switch dans une boucle : break et continue

Dans une boucle, break dans un switch ne quitte que le switch, pas la boucle. Pour arrêter la boucle, utilisez break 2. continue dans un switch se comporte comme break, et PHP avertit à la compilation : "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Écrivez continue 2 pour passer à l'itération suivante de la boucle.

switch ou match

PHP 8 a ajouté match, qui couvre la plupart des usages de switch avec moins de code. Il compare avec ===, renvoie une valeur, ne passe jamais au cas suivant, accepte des conditions séparées par des virgules, et lève une UnhandledMatchError quand rien ne correspond, si bien qu'un cas oublié ne peut pas passer inaperçu.

Gardez switch quand un case a besoin de plusieurs instructions, ou quand le passage au cas suivant est le but, comme dans l'exemple des offres. Pour associer une valeur à un résultat, match est plus court et plus sûr.

Questions fréquentes

Comment utiliser plusieurs cas pour un même bloc dans un switch PHP ?

Empilez les étiquettes case sans code entre elles : case 'sat': case 'sun': echo 'weekend'; break;. Chaque étiquette passe au code partagé. PHP n'a pas de syntaxe case 'sat', 'sun': pour switch ; cette forme avec virgule appartient à match.

Le switch PHP utilise-t-il une comparaison stricte ?

Non. switch compare avec le == souple, donc case '1': correspond à l'entier 1 et case 0: correspond à '0'. Pour une comparaison stricte ===, utilisez une expression match ou switch (true) avec === dans chaque case.

Que se passe-t-il si j'oublie break dans un switch PHP ?

L'exécution continue : après le case qui correspond, PHP exécute le code de tous les case situés en dessous jusqu'à un break, un return ou la fin du switch. C'est parfois voulu, mais le plus souvent c'est un bug.

Un switch PHP peut-il tester des plages comme « supérieur à » ?

Oui, avec switch (true) : chaque case contient une condition comme case $score >= 90:, et la première vraie s'exécute. Une expression match (true) fait la même chose avec une comparaison stricte et renvoie une valeur.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER