Instruction switch en PHP : Guide complet
L'instruction switch en PHP permet de tester une expression contre plusieurs valeurs et d'exécuter le bloc correspondant. Guide complet avec exemples.
L'instruction switch en PHP compare une expression à une liste de valeurs possibles et exécute le bloc qui correspond. C'est une alternative plus lisible à une longue chaîne d'instructions if...elseif...else lorsque vous testez la même variable contre de nombreuses valeurs fixes.
Cette page couvre la syntaxe, le fonctionnement réel de la correspondance et du passage en cascade, des exemples exécutables, l'alternative match de PHP 8, ainsi que les pièges courants.
Syntaxe
switch (expression) {
case value1:
// runs when expression == value1
break;
case value2:
// runs when expression == value2
break;
default:
// runs when nothing above matched
}L'expression est évaluée une seule fois. Son résultat est ensuite comparé, de haut en bas, à chaque valeur case à l'aide d'une comparaison lâche (==). À la première correspondance, PHP commence à exécuter les instructions depuis ce case et continue jusqu'à rencontrer un break (ou la fin du switch). Le bloc default optionnel s'exécute quand aucun case ne correspond — par convention, il est placé en dernier.
Un exemple fonctionnel
Cet exemple associe un numéro de jour à un nom et affiche le résultat :
<?php
$day = 3;
switch ($day) {
case 1:
echo "Monday";
break;
case 2:
echo "Tuesday";
break;
case 3:
echo "Wednesday";
break;
default:
echo "Another day";
}
// Output: WednesdayComme $day vaut 3, le troisième case correspond, "Wednesday" est affiché, et break arrête l'exécution avant le bloc default.
Pourquoi break est important : le passage en cascade
Si vous oubliez un break, l'exécution « tombe » dans le cas suivant et continue jusqu'à en trouver un. C'est le bug le plus courant avec switch :
<?php
$role = "editor";
switch ($role) {
case "editor":
echo "Can edit. ";
// no break — falls through!
case "viewer":
echo "Can view.";
break;
}
// Output: Can edit. Can view.Ici "editor" correspond, mais sans break, PHP exécute également le bloc viewer.
Passage en cascade intentionnel (regroupement de cas)
Le passage en cascade est parfois utile de manière délibérée : empiler des cas vides permet à plusieurs valeurs de partager un même bloc.
<?php
$letter = "e";
switch ($letter) {
case "a":
case "e":
case "i":
case "o":
case "u":
echo "Vowel";
break;
default:
echo "Consonant";
}
// Output: VowelTester une condition avec true
Un switch peut également remplacer une échelle if...elseif pour des vérifications par plages. Faites un switch sur true et placez une expression booléenne dans chaque case :
<?php
$score = 82;
switch (true) {
case $score >= 90:
echo "A";
break;
case $score >= 80:
echo "B";
break;
case $score >= 70:
echo "C";
break;
default:
echo "F";
}
// Output: BLe premier case dont l'expression est égale à true l'emporte, donc l'ordre est important — listez la condition la plus stricte en premier.
switch vs match (PHP 8+)
PHP 8 a introduit l'expression match, un cousin plus strict de switch. Préférez match lorsque vous mappez simplement une valeur à un résultat :
<?php
$status = 404;
$message = match ($status) {
200, 201 => "Success",
404 => "Not Found",
500 => "Server Error",
default => "Unknown",
};
echo $message;
// Output: Not FoundDifférences clés :
switch | match | |
|---|---|---|
| Comparaison | lâche (==) | stricte (===) |
| Passage en cascade | oui (nécessite break) | aucun |
| Retourne une valeur | non | oui (c'est une expression) |
Valeur non correspondante sans default | ne fait rien | lève UnhandledMatchError |
Le piège de la comparaison lâche
Comme switch utilise ==, un 0 numérique peut correspondre à une chaîne non vide dans du code ancien. En PHP 8+, les règles de comparaison chaîne-vers-nombre ont été renforcées, mais gardez des types cohérents pour éviter les surprises :
<?php
$value = 0;
switch ($value) {
case "hello":
echo "matched hello";
break;
default:
echo "no match";
}
// Output (PHP 8+): no matchEn PHP 7, le même code aurait affiché matched hello car 0 == "hello" était true. En cas de doute, utilisez match pour une comparaison stricte.
Bonnes pratiques
- Ajoutez toujours
breakaprès chaque cas, sauf si vous voulez délibérément un passage en cascade (et commentez-le dans ce cas). - Incluez toujours un
defaultpour gérer les valeurs inattendues plutôt que de ne rien faire silencieusement. - Regroupez les cas liés en empilant des étiquettes
casevides plutôt qu'en dupliquant du code. - Préférez
match(PHP 8+) lorsque vous retournez une valeur ou avez besoin d'une comparaison stricte. - Utilisez
if...elseiflorsque vous testez des expressions différentes, et non une seule valeur contre plusieurs.
Sujets associés
- PHP If...Else...Elseif — branchement conditionnel
- PHP Operators — comparaison et l'expression
match - PHP Loops — répétition de blocs de code