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";
}
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.
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) { ... }.
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
casepropose une valeur possible à comparer à$jour. - Le mot-clé
breakarrête l'exécution duswitchdès qu'uncasecorrespondant a été trouvé et exécuté. - Le bloc
default(facultatif) est exécuté si aucuncasene correspond.
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.
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 :
matchutilise une comparaison stricte (équivalente à===), alors queswitchutilise une comparaison souple (==).matchretourne une valeur, qu'on peut directement affecter à une variable.- Pas besoin de
break: un seul cas est exécuté, sans risque de fallthrough accidentel.
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";
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
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.
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.".
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.".
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.
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