W3docs

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: Wednesday

Comme $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: Vowel

Tester 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: B

Le 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 Found

Différences clés :

switchmatch
Comparaisonlâche (==)stricte (===)
Passage en cascadeoui (nécessite break)aucun
Retourne une valeurnonoui (c'est une expression)
Valeur non correspondante sans defaultne fait rienlè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 match

En 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 break après chaque cas, sauf si vous voulez délibérément un passage en cascade (et commentez-le dans ce cas).
  • Incluez toujours un default pour gérer les valeurs inattendues plutôt que de ne rien faire silencieusement.
  • Regroupez les cas liés en empilant des étiquettes case vides 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...elseif lorsque vous testez des expressions différentes, et non une seule valeur contre plusieurs.

Sujets associés

Pratique

Pratique
En PHP, quelles instructions peuvent être utilisées dans une instruction switch ?
En PHP, quelles instructions peuvent être utilisées dans une instruction switch ?
Was this page helpful?