W3docs

switch

En PHP, le mot-clé "switch" évalue une valeur et exécute différentes actions selon le résultat. Il offre une alternative aux chaînes de "if".

L'instruction switch en PHP

L'instruction PHP switch évalue une expression et exécute le bloc de code correspondant à sa valeur. C'est l'alternative plus lisible à une longue chaîne d'instructions if / elseif / else lorsque vous comparez la même variable à de nombreuses valeurs possibles.

Ce chapitre couvre la syntaxe, le mot-clé essentiel break, la chute intentionnelle, la syntaxe alternative endswitch, et le piège lié à la comparaison lâche qui prend de court la plupart des débutants.

Syntaxe

La syntaxe de base d'une instruction switch en PHP est la suivante :

<?php
switch ($value) {
  case $value1:
    // Code block here
    break;
  case $value2:
    // Code block here
    break;
  default:
    // Code block here
}

PHP compare $value à chaque case de haut en bas. La première correspondance l'emporte : son bloc s'exécute, et break quitte le switch. Si aucun case ne correspond, le bloc default optionnel s'exécute. default n'a pas besoin d'être en dernier, mais le placer à la fin est la convention attendue par les lecteurs.

Pourquoi break est important

L'instruction break arrête l'exécution et sort du bloc switch. Sans elle, PHP continue d'exécuter le code de chaque case suivant jusqu'à rencontrer un break ou la fin du bloc — un comportement appelé fall-through. C'est le bug le plus courant avec switch :

<?php
$role = "editor";

switch ($role) {
  case "admin":
    echo "Full access. ";
    // no break — execution "falls through" to the next case
  case "editor":
    echo "Can edit content. ";
    break;
  case "viewer":
    echo "Read only.";
    break;
}
// Output: Can edit content.

Ici editor correspond, affiche son message, et le break sort proprement. Oublier le break après admin laisserait un administrateur continuer à exécuter le code de editor aussi. Voir break pour le mot-clé complet.

Chute intentionnelle (fall-through)

Le fall-through n'est pas toujours une erreur. Empiler des étiquettes case vides permet à plusieurs valeurs de partager un même bloc — une façon propre de regrouper des conditions :

<?php
$month = 2;

switch ($month) {
  case 12:
  case 1:
  case 2:
    echo "Winter";
    break;
  case 3:
  case 4:
  case 5:
    echo "Spring";
    break;
  default:
    echo "Another season";
}
// Output: Winter

Exemples

Voici quelques exemples pratiques d'utilisation de switch :

<?php

// Example 1
$dayOfWeek = "Wednesday";

switch ($dayOfWeek) {
  case "Monday":
  case "Tuesday":
  case "Wednesday":
  case "Thursday":
  case "Friday":
    echo "It's a weekday.";
    break;
  case "Saturday":
  case "Sunday":
    echo "It's a weekend.";
    break;
}

// Example 2
$grade = "B";

switch ($grade) {
  case "A":
    echo "Excellent!";
    break;
  case "B":
    echo "Good job!";
    break;
  case "C":
    echo "Could do better.";
    break;
  default:
    echo "Please enter a valid grade.";
}

L'exemple 1 regroupe les noms de jours de la semaine avec des étiquettes case empilées pour distinguer les jours ouvrables du week-end. L'exemple 2 associe une lettre de note à un message de retour, avec default qui intercepte toute valeur ne correspondant à aucun cas.

Le piège de la comparaison lâche

Par défaut, switch compare avec l'égalité lâche (==), de sorte que les valeurs sont comparées après la conversion de type — et non avec le strict ===. Cela peut produire des correspondances surprenantes :

<?php
$value = "1";

switch ($value) {
  case 1:
    echo "Matched the integer 1!";
    break;
  default:
    echo "Matched default.";
}
// Output: Matched the integer 1!

La chaîne "1" correspond à l'entier case 1 car == convertit les types avant de comparer. Lorsque vous avez besoin d'une vérification stricte des types, utilisez une chaîne de if / elseif avec ===, ou utilisez l'expression match (PHP 8+), qui compare strictement et retourne une valeur :

<?php
$grade = "B";

$message = match ($grade) {
  "A" => "Excellent!",
  "B" => "Good job!",
  "C" => "Could do better.",
  default => "Please enter a valid grade.",
};

echo $message;
// Output: Good job!

match ne fait pas de fall-through et n'a pas besoin de break, ce qui élimine toute une catégorie de bugs.

Syntaxe alternative avec endswitch

Lors de l'intégration de PHP dans des templates HTML, la forme avec deux-points et endswitch peut être plus lisible :

<?php switch ($status): ?>
  <?php case "active": ?>
    <span>Active</span>
    <?php break; ?>
  <?php default: ?>
    <span>Inactive</span>
<?php endswitch; ?>

Avantages

  • Lisibilité — un switch est plus facile à parcourir que plusieurs instructions if lorsque vous comparez la même variable à plusieurs valeurs.
  • Évaluation unique — l'expression du switch est évaluée une seule fois, puis comparée à chaque case.

Chapitres associés

Pratique

Pratique
Selon le contenu de la page sur w3docs.com, dans quelles circonstances peut-on utiliser une instruction 'switch' en PHP ?
Selon le contenu de la page sur w3docs.com, dans quelles circonstances peut-on utiliser une instruction 'switch' en PHP ?
Was this page helpful?