Aller au contenu principal

Les structures conditionnelles

Petite vérification​

Avant de commencer, vérifiez si vous êtes capable d'expliquer la différence entre == et === en PHP ?

📌 Réponse attendue

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";
}
info

Remarquez que les structures (if et switch) 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 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 ?


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 if / elseif / else​

Créez une variable $statutBadge valant "actif". Utilisez une structure if / elseif / else 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 - if/elseif reste lisible pour un nombre limité de cas

Dès que le nombre de valeurs à comparer augmente, répéter elseif ($statutBadge === ...) devient vite long à lire. C'est exactement le problème que switch permet d'éviter.

Cette même logique peut aussi s'écrire avec un switch. Complétez le mot-clé manquant :

É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