1.2 · Conditions : if/else, switch, ternaire

Niveau 1 · Bases du langage

1.2Conditions : if/else, switch, ternaire

Objectif : faire prendre des décisions à votre code avec if/elseif/else, switch et le ternaire (plus ?? et match), en construisant des conditions justes — le fondement de toute logique.
Temps estimé : 10 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

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.

Erreur d'interprétation fréquente : « if ($x) suffit pour tester une valeur » ou « ?? et ?: sont équivalents ». Non. if ($x) traite 0, '0', '' et null de la même façon (falsy) : une valeur légitime « 0 » est confondue avec une absence — testez explicitement (isset, !== '', === 0). Et ?? ne se déclenche que sur null/absence, là où ?: se déclenche sur tout falsy : pour une valeur par défaut qui respecte le 0 saisi, c'est ?? qu'il faut.
Les structures conditionnelles Choisir selon l'intention if / elseif / else Conditionsvariées, plages, logiqueswitch / match Aiguiller sur lesvaleurs d'une variableTernaire / ?? Affectationcourte, valeur par défaut
Choisir selon l'intention
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Décider : Riad écrit if/elseif/else pour les conditions variées (âge, pays) avec des comparaisons strictes. 2) Aiguiller : il passe les trois profils au switch (break obligatoires) ou au match strict qui renvoie le tarif. 3) Raccourcir : ternaire pour le libellé en une ligne, ?? pour la page par défaut (null/absence). Leçon : la structure qui exprime le plus clairement l'intention — la lisibilité prime.

Le switch sans break (ne faites jamais ça)

« J'ai oublié un break, mais ça ne change rien, si ? »
Verdict : si — l'exécution tombe dans le case suivant et le visiteur paie le tarif du voisin.
« if ($code) suffit pour vérifier le code promo. »
Verdict : le code « 0 » passe pour absent — et le client qui avait raison repart sans réduction.

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

  1. Écrivez une condition if/elseif/else (ex. déterminer une mention selon une note) ; construisez la condition avec des comparaisons (===, >=…) et de la logique (&&, ||).
  2. Utilisez un switch pour comparer une variable à plusieurs valeurs (n'oubliez pas les `break` !) avec un cas `default`.
  3. Écrivez un ternaire pour une affectation conditionnelle courte (`$statut = $age >= 18 ? 'majeur' : 'mineur';`).
  4. 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.
Vous faites prendre des décisions à votre code avec if/elseif/else, switch et le ternaire (plus ?? et match), en construisant des conditions justes — le fondement de toute logique.

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.

Checklist sortie de section
  • 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.
Auto-évaluation 1-5 : est-ce que mes conditions distinguent absence et valeur falsy ?est-ce que chaque structure exprime clairement son intention ?

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.

Vérifiez votre compréhension

Quelle valeur PHP considère-t-il « falsy » (fausse) de façon piégeuse ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 1Questions inédites et durcies pour valider vos acquis