Aller au contenu principal

Les structures conditionnelles

Notions théoriques

Une structure conditionnelle permet à un programme de choisir quelle instruction exécuter en fonction d'une condition. C'est ce qui donne à un programme la capacité de "prendre des décisions".

Dans la séance précédente, vous avez découvert les opérateurs de comparaison (==, ===, <, >=, ...) et les opérateurs logiques (&&, ||, !). Ce sont précisément ces opérateurs que l'on utilise pour écrire les conditions des structures que nous allons voir maintenant.

La structure if / elseif / else

La structure if exécute un bloc de code uniquement si une condition est vraie.

<?php
$age = 20;

if ($age >= 18) {
echo "Vous êtes majeur.";
}

On peut ajouter un bloc else, exécuté uniquement si la condition du if est fausse :

<?php
$age = 15;

if ($age >= 18) {
echo "Vous êtes majeur.";
} else {
echo "Vous êtes mineur.";
}

Lorsqu'il existe plusieurs cas possibles, on peut enchaîner des blocs elseif entre le if et le else :

<?php
$note = 12;

if ($note >= 16) {
echo "Mention Très Bien";
} elseif ($note >= 14) {
echo "Mention Bien";
} elseif ($note >= 10) {
echo "Admis";
} else {
echo "Non admis";
}
info

PHP évalue les conditions dans l'ordre d'écriture, et s'arrête au premier bloc dont la condition est vraie. Les blocs suivants ne sont alors même pas testés.

astuce

Une condition peut combiner plusieurs opérateurs de comparaison avec des opérateurs logiques, exactement comme vu dans la séance précédente : if ($age >= 18 && $aBillet) { ... }.

attention

Ne pas oublier les accolades { et } qui délimitent le bloc de code associé à chaque condition. Les oublier est une source fréquente d'erreurs, surtout lorsque le bloc ne contient qu'une seule instruction.

La structure switch

La structure switch permet de comparer une même variable à plusieurs valeurs possibles, sans avoir à répéter elseif à chaque fois. Elle est particulièrement adaptée lorsqu'une variable peut prendre un nombre limité de valeurs précises.

<?php
$jour = "mardi";

switch ($jour) {
case "lundi":
echo "Début de semaine.";
break;
case "mardi":
echo "Deuxième jour de la semaine.";
break;
case "samedi":
case "dimanche":
echo "C'est le week-end !";
break;
default:
echo "Jour non reconnu.";
}
  • Chaque case propose une valeur possible à comparer à $jour.
  • Le mot-clé break arrête l'exécution du switch dès qu'un case correspondant a été trouvé et exécuté.
  • Le bloc default (facultatif) est exécuté si aucun case ne correspond.
attention

Si l'on oublie break à la fin d'un case, l'exécution continue dans le case suivant, même s'il ne correspond pas à la valeur testée. On appelle cela le fallthrough. C'est parfois utilisé volontairement (comme case "samedi": suivi directement de case "dimanche": dans l'exemple ci-dessus), mais c'est une source fréquente de bugs lorsque c'est un oubli.

info

Contrairement à if, qui compare avec == de façon lâche, switch compare également ses case avec l'opérateur == (comparaison de valeur, sans vérifier strictement le type).

L'expression match (PHP 8)

Depuis PHP 8, l'expression match propose une alternative moderne à switch. Elle est plus stricte et plus compacte : elle retourne directement une valeur, sans avoir besoin de break.

<?php
$jour = "mardi";

$message = match ($jour) {
"lundi" => "Début de semaine.",
"mardi" => "Deuxième jour de la semaine.",
"samedi", "dimanche" => "C'est le week-end !",
default => "Jour non reconnu.",
};

echo $message;

Les différences essentielles avec switch :

  • match utilise une comparaison stricte (équivalente à ===), alors que switch utilise une comparaison souple (==).
  • match retourne une valeur, qu'on peut directement affecter à une variable.
  • Pas besoin de break : un seul cas est exécuté, sans risque de fallthrough accidentel.
info

match est une notion récente et volontairement présentée ici de façon simple. Elle sera approfondie plus tard (PHP Expert), avec des exemples plus avancés.

Exemple pratique

<?php
// Système de notation d'un contrôle
$note = 14;

// Structure if / elseif / else, avec les opérateurs de comparaison vus précédemment
if ($note >= 16) {
$appreciation = "Excellent";
} elseif ($note >= 12) {
$appreciation = "Bien";
} elseif ($note >= 10) {
$appreciation = "Passable";
} else {
$appreciation = "Insuffisant";
}

echo "Appréciation : " . $appreciation . "\n";

// Structure switch, pour un nombre limité de valeurs précises
$niveau = "B2";

switch ($niveau) {
case "A1":
case "A2":
echo "Niveau débutant.\n";
break;
case "B1":
case "B2":
echo "Niveau intermédiaire.\n";
break;
case "C1":
case "C2":
echo "Niveau avancé.\n";
break;
default:
echo "Niveau non reconnu.\n";
}

// Expression match, alternative moderne et stricte à switch
$statutCommande = "expediee";

$messageStatut = match ($statutCommande) {
"en_attente" => "Votre commande est en attente.",
"expediee" => "Votre commande a été expédiée.",
"livree" => "Votre commande a été livrée.",
default => "Statut inconnu.",
};

echo $messageStatut . "\n";
info

Remarquez que les trois structures (if, switch, match) permettent d'arriver à des résultats similaires. Le choix entre elles dépend du contexte : if pour des conditions complexes ou des plages de valeurs (comme les notes), switch ou match pour comparer une variable à un ensemble de valeurs précises.

Test de mémorisation/compréhension


Quel mot-clé PHP permet de tester une condition ?


Quel bloc est exécuté si aucune condition d'un if/elseif n'est vraie ?


Quel mot-clé permet d'arrêter l'exécution d'un switch dès qu'un case correspondant a été trouvé ?


Que se passe-t-il si on oublie le mot-clé break dans un case d'un switch ?


Quel bloc d'un switch est exécuté si aucun case ne correspond à la valeur testée ?


Depuis quelle version de PHP l'expression match est-elle disponible ?


Quelle est une différence essentielle entre match et switch ?


Quel symbole sépare une valeur testée et son résultat dans une expression match ?


Combien de blocs elseif peut-on enchaîner après un if en PHP ?


Quels opérateurs, vus dans la séance précédente, sont utilisés pour écrire les conditions d'un if ?


TP pour réfléchir et résoudre des problèmes

Gestion d'un contrôle d'accès à une salle

  • Dans votre répertoire "Documents" créez le répertoire tp_controle_acces.
  • Dans ce répertoire créez le fichier acces.php.

L'objectif de ce TP est de simuler un contrôle d'accès à une salle informatique, à l'aide des structures conditionnelles vues dans cette séance.

Étape 1 — Vérifier l'accès avec if / else

Créez une variable $age (16) et une variable $aAutorisation (true). L'accès est autorisé si l'utilisateur a au moins 18 ans, ou s'il a une autorisation spéciale.


Bonne pratique - Combiner comparaison et logique

Réutiliser les opérateurs de comparaison (>=) et logiques (||) vus dans la séance précédente permet d'écrire des conditions riches en une seule ligne, plutôt que d'empiler plusieurs if imbriqués.

Étape 2 — Afficher le niveau de la salle avec switch

Créez une variable $salle valant "info2". Utilisez un switch pour afficher le bâtiment correspondant : "info1" et "info2" sont dans le bâtiment A, "reseau1" est dans le bâtiment B, toute autre salle affiche "Salle inconnue.".


Bonne pratique - Regrouper des case similaires

Empiler plusieurs case sans instruction entre eux est une technique légitime pour partager un même traitement entre plusieurs valeurs. Attention toutefois à ne jamais oublier le break final, sous peine de fallthrough vers le case suivant.

Étape 3 — Déterminer le statut avec match

Créez une variable $statutBadge valant "actif". Utilisez une expression match pour affecter à une variable $messageBadge le texte correspondant : "actif" → "Badge valide.", "expire" → "Badge expiré, à renouveler.", "perdu" → "Badge signalé perdu.", toute autre valeur → "Statut de badge inconnu.".


Bonne pratique - Préférer match pour une simple correspondance de valeurs

Lorsque chaque cas doit simplement retourner une valeur (sans logique complexe ni plusieurs instructions), match est plus concis et plus sûr que switch : pas de break à oublier, et la comparaison stricte évite les erreurs de type.

Étape 4 — Afficher le récapitulatif complet

Terminez en affichant les résultats des trois étapes précédentes.


Bonne pratique - Bien choisir sa structure conditionnelle

if/elseif/else convient aux conditions complexes ou aux plages de valeurs. switch et match conviennent mieux pour comparer une même variable à un ensemble limité de valeurs précises : le code est alors plus lisible qu'une longue suite de elseif.

Étape 5 — Exécuter le script

php acces.php
📌 Une solution