1.2Conditions : if/else, switch, ternaire
L'essentiel en 30 secondes
- if/elseif/else = le cas général : conditions variées, plages, logique (&& || !) — la structure la plus flexible.
- switch/match = aiguiller sur UNE variable : plusieurs valeurs exactes, plus lisible qu'une cascade — break obligatoire en switch.
- Ternaire et ?? = courts et précis : ternaire pour affecter en une ligne, ?? pour les valeurs par défaut (null/absence uniquement).
Mini-cas filé — Riad affiche le bon tarif à Constantine
Riad doit afficher un tarif selon le profil du visiteur de son site vitrine : étudiant, professionnel, ou autre — avec une page par défaut si le paramètre est absent. Il écrit d'abord if ($profil) avec une cascade bancale : le profil « 0 » (un code légitime) est traité comme absent à cause des valeurs falsy. Il corrige en testant explicitement, utilise un switch avec break pour les trois profils, un ternaire pour le libellé « majeur/mineur » d'une mention légale, et ?? pour la page par défaut. Chaque visiteur voit désormais le bon tarif.
Suite du cas 1.1 — Riad passe du stockage des données aux décisions.
1. if/elseif/else & falsy
Les conditions font prendre des décisions : if (condition) { … }, étendu par else (sinon) et elseif (sinon si). La condition s'évalue à true/false — généralement une comparaison ($age >= 18) ou une combinaison logique. Attention aux valeurs « falsy » (false, 0, chaîne vide, '0', null, tableau vide = « faux ») : elles peuvent causer des bugs subtils. Construire ses conditions avec === et la logique (&& || !).
Riad remplace son if ($profil) par un test explicite : le code « 0 » n'est plus confondu avec une absence — les tarifs s'appliquent au bon visiteur.
2. switch, ternaire, ?? et match
Le switch compare UNE variable à plusieurs valeurs (plus lisible qu'une cascade) — ne pas oublier les break (sinon on « tombe » dans le case suivant). Le ternaire est un if/else court qui renvoie une valeur ($statut = $age >= 18 ? 'majeur' : 'mineur';). PHP moderne : ?? (null coalescent, pour les valeurs par défaut — ne se déclenche que sur null/absence) et match (PHP 8+, switch strict qui renvoie une valeur). Dans les templates : syntaxe alternative if (…): … endif;.
Riad aiguille ses trois profils avec un switch (break partout), fixe la page par défaut avec $_GET['page'] ?? 1, et simplifiera demain en match strict.
Le switch sans break (ne faites jamais ça)
Moralité : un break oublié coûte un tarif, un test flou coûte un client.
🔎 Exemple concret — 🔎 Exemple concret — Le bon outil selon le cas
Lisibilité d'abord, comme Riad pour ses tarifs.
$statut = $age >= 18 ? 'majeur' : 'mineur'; // ternaire
$page = $_GET['page'] ?? 1; // ?? : defaut si absent
$prix = match($taille) { // match (PHP 8)
'S' => 10,
'M' => 15,
'L' => 20,
default => 0
};
Lecture : chaque structure exprime clairement son intention : affecter, défaut, aiguillage qui renvoie.
Leçon : ?? ne se déclenche que sur null/absence (pas sur 0 ou '') — précis pour les défauts.
Vocabulaire de la section
- if / elseif / else
- Exécute un bloc SI une condition est vraie ; else (sinon), elseif (sinon si, plusieurs conditions en cascade). La condition s'évalue à true/false.
Exemple simple : La mention selon la note écrite par Riad (if/elseif/else).
Ce que ce n'est pas : une cascade de ternaires imbriqués illisibles.
Réflexe : conditions variées = if/elseif, une branche par cas.
- Valeurs « falsy »
- Valeurs considérées « fausses » par PHP dans une condition : false, 0, chaîne vide, '0', null, tableau vide ; le reste est « vrai ».
Exemple simple : Le code profil « 0 » de Riad, traité à tort comme absent.
Ce que ce n'est pas : croire que toute chaîne non vide est vraie (sauf '0').
Réflexe : tester explicitement : isset, !== '', === 0.
- switch
- Compare UNE variable à plusieurs valeurs (case), plus lisible qu'une cascade de elseif ; le break sort du switch (l'oublier fait tomber dans le case suivant) ; default pour les autres cas.
Exemple simple : Les trois profils tarifaires aiguillés par Riad.
Ce que ce n'est pas : un switch sans break qui exécute deux tarifs à la fois.
Réflexe : un case = un break, toujours un default.
- Ternaire
- Raccourci if/else renvoyant une valeur : condition ? valeurSiVrai : valeurSiFaux. Pratique pour les affectations conditionnelles courtes.
Exemple simple : Le $statut majeur/mineur de Riad en une ligne.
Ce que ce n'est pas : trois ternaires imbriqués pour les tarifs.
Réflexe : simple et court = ternaire ; complexe = if/else.
- Null coalescent ?? / match
- ?? renvoie la gauche si elle existe et n'est pas null, sinon la droite (valeurs par défaut). match (PHP 8+) = switch moderne, strict, qui renvoie une valeur.
Exemple simple : La $_GET['page'] ?? 1 et le match des tailles de Riad.
Ce que ce n'est pas : ?: pour un défaut qui écrase le 0 saisi.
Réflexe : défaut sur absence = ?? ; aiguillage qui renvoie = match.
En pratique — En pratique — Faire prendre des décisions au code
- Écrivez une condition if/elseif/else (ex. déterminer une mention selon une note) ; construisez la condition avec des comparaisons (===, >=…) et de la logique (&&, ||).
- Utilisez un switch pour comparer une variable à plusieurs valeurs (n'oubliez pas les `break` !) avec un cas `default`.
- Écrivez un ternaire pour une affectation conditionnelle courte (`$statut = $age >= 18 ? 'majeur' : 'mineur';`).
- Testez l'opérateur `??` pour une valeur par défaut (ex. récupérer un paramètre absent), et repérez la syntaxe alternative `if (...): ... endif;` pour les templates.
Script prêt à dire — expliquer le choix de la structure (30 s)
« Pour ces trois profils, je propose un switch : on aiguille une seule variable sur des valeurs exactes, c'est plus lisible qu'une cascade de elseif. Et pour la page par défaut, ?? suffit — il ne se déclenche que si le paramètre est absent, sans écraser un 0 légitime. »
À dire en revue de code ; montrer la grille if/switch/ternaire/match/??.
Modèle copier-coller — tarifs selon le profil (switch + ?? + ternaire)
= 18) ? 'majeur' : 'mineur';
echo 'Tarif : ' . $tarif . ' — ' . $mention;
Tarifs à Constantine
Comme Riad : un switch par profil avec break et default — ajouter un profil, c'est ajouter un case, sans toucher aux autres.
Paramètre absent
$_GET['page'] ?? 1 donne la page par défaut uniquement en cas d'absence — le 0 explicite d'une pagination reste respecté.
Libellé en une ligne
Un ternaire pour majeur/mineur : une affectation simple qui tient en une ligne lisible, sans bloc if/else.
Montée en match
En PHP 8+, convertir le switch en match : comparaison stricte, valeur renvoyée, aucun break à oublier.
✓ Bonnes pratiques
- if/elseif pour les conditions variées ; switch/match pour aiguiller sur une variable.
- Ternaire pour une affectation SIMPLE ; jamais imbriqué (illisible).
- Utiliser ?? pour les valeurs par défaut (précis sur null/absence).
✗ Pièges fréquents
- Oublier un break dans un switch (« fall-through » dans le case suivant).
- Se reposer sur if ($x) et buter sur les valeurs falsy (0, '0', '').
- Empiler des ternaires imbriqués (préférer un if/else clair).
Points clés à retenir
- Les CONDITIONS font prendre des décisions : `if (condition) { ... }`, étendu par `else` (sinon) et `elseif` (sinon si). La condition s'évalue à true/false (souvent une comparaison).
- Attention aux valeurs « FALSY » (false, 0, chaîne vide, '0', null, tableau vide = « faux ») ; construire ses conditions avec `===` et la logique (&& || !).
- SWITCH compare une variable à plusieurs valeurs (plus lisible qu'une cascade) — ne pas OUBLIER les `break` (sinon on « tombe » dans le case suivant). TERNAIRE = if/else court renvoyant une valeur.
- PHP moderne : `??` (null coalescent, pour les valeurs par défaut), `match` (PHP 8+, switch strict qui renvoie une valeur). Syntaxe alternative `if (...): ... endif;` pour les templates HTML.
Défi 48h — appliquez demain
Prenez le modèle ci-dessus : ajoutez un 4e profil (un case + break), remplacez une cascade de elseif par un switch, et convertissez une affectation simple en ternaire. Vérifiez chaque profil en local. 20 minutes suffisent.
- Je choisis if/elseif, switch, ternaire, match ou ?? selon l'intention.
- Je n'oublie jamais les break et je teste explicitement les falsy.
- J'ai écrit ?? pour un défaut et un ternaire pour une affectation courte.
Questions fréquentes
Quand utiliser if/elseif, switch, ternaire ou match — comment choisir la bonne structure ?
if/elseif/else : le cas général, pour des conditions VARIÉES (comparaisons complexes, combinaisons logiques, plages). switch : pour comparer UNE variable à plusieurs valeurs EXACTES — plus lisible qu'une cascade ; attention, il compare en `==` (lâche) et il faut les `break`. Ternaire : pour un if/else SIMPLE qui RENVOIE une valeur — jamais imbriqué. match (PHP 8+) : switch moderne qui RENVOIE une valeur, compare en STRICT, sans `break`. `??` : pour les VALEURS PAR DÉFAUT. Le principe directeur : choisir la structure qui exprime le plus clairement l'intention — la lisibilité prime.
Qu'est-ce que les valeurs « falsy » en PHP, et pourquoi peuvent-elles causer des bugs ?
Dans un contexte booléen, PHP évalue la « vérité » des valeurs. FALSY : `false`, `0` et `0.0`, `''`, `'0'` (le piège !), `null`, `[]`. Le piège de `'0'` : vérifier un champ avec `if ($_POST['champ'])` échoue si l'utilisateur a saisi « 0 ». Soyez EXPLICITE : `isset($x)`, `$x !== ''`, `$x === 0` — et `??` pour les défauts, qui ne se déclenche que sur null/absence.
Quelle valeur PHP considère-t-il « falsy » (fausse) de façon piégeuse ?