1.2Conditions (if/else, switch, ternaire)
Les conditions permettent à un programme de PRENDRE DES DÉCISIONS : exécuter certain code SI une condition est vraie, autre chose sinon. C'est le fondement de toute logique. La structure de base est le if : if (condition) { ... } — le bloc entre accolades s'exécute seulement si la condition est vraie. On l'étend avec else (« sinon », exécuté si la condition est fausse) et elseif (« sinon si », pour tester plusieurs conditions en cascade) : if (...) { ... } elseif (...) { ... } else { ... }. La condition est une expression qui s'évalue à vrai (true) ou faux (false) — généralement une COMPARAISON ($age >= 18) ou une combinaison logique ($age >= 18 && $pays === 'FR'). PHP évalue aussi la « vérité » de valeurs non booléennes (une chaîne vide, 0, null sont « faux » ; le reste est « vrai ») — d'où l'importance de bien comprendre ce qui est vrai/faux (les valeurs « falsy »).
Deux autres structures utiles. Le switch : pour comparer UNE variable à PLUSIEURS valeurs possibles, plus lisible qu'une longue cascade de elseif — switch ($jour) { case 'lundi': ...; break; case 'mardi': ...; break; default: ...; }. Chaque case teste une valeur ; le break est IMPORTANT (il sort du switch — l'oublier fait « tomber » l'exécution dans le case suivant, un piège classique) ; default gère les autres cas. Le ternaire : un raccourci pour un if/else simple qui renvoie une valeur — $statut = ($age >= 18) ? 'majeur' : 'mineur'; (« si age ≥ 18, alors 'majeur', sinon 'mineur' »). Pratique pour les affectations conditionnelles courtes. PHP moderne offre aussi l'opérateur null coalescent ?? (renvoie la valeur de gauche si elle existe et n'est pas null, sinon celle de droite — très utile pour les valeurs par défaut, par exemple récupérer un paramètre de formulaire avec une valeur par défaut s'il est absent), et l'expression match (PHP 8+, un switch moderne, strict et qui renvoie une valeur). Un point de style pour les TEMPLATES : dans du HTML, on utilise souvent la syntaxe alternative if (...): ... endif; (avec deux-points et endif au lieu d'accolades), plus lisible mêlée au HTML. Les conditions sont partout dans le code : afficher un contenu selon que l'utilisateur est connecté ou non, valider une donnée, choisir un traitement, gérer les cas d'erreur. Maîtriser if/elseif/else, switch et le ternaire — et bien construire ses conditions (comparaisons justes, logique claire) — est indispensable : c'est ce qui rend un programme « intelligent », capable de réagir différemment selon les situations.
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.
- 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 ».
- 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.
- Ternaire
- Raccourci if/else renvoyant une valeur : `condition ? valeurSiVrai : valeurSiFaux`. Pratique pour les affectations conditionnelles courtes.
- 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.
Comment faire prendre des décisions au code, et attention à quoi ?
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.
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.
Questions fréquentes
Quand utiliser if/elseif, switch, ternaire ou match — comment choisir la bonne structure ?
Chaque structure conditionnelle a son terrain de prédilection, et choisir la bonne rend le code plus LISIBLE — voici comment décider selon la situation. (1) if / elseif / else — le cas général, pour des conditions VARIÉES. Utilisez-le quand vos conditions sont DIFFÉRENTES les unes des autres (pas juste comparer une même variable à des valeurs), notamment avec des comparaisons complexes, des combinaisons logiques, des plages. Exemples : if ($age >= 18 && $pays === 'FR'), if ($note >= 16) ... elseif ($note >= 12) ... (des PLAGES de valeurs), if ($user->estConnecte() && $user->aLeDroit('editer')). C'est la structure la plus FLEXIBLE (toute condition booléenne), à utiliser dès que les conditions ne sont pas de simples égalités sur une même variable. (2) switch — pour comparer UNE variable à PLUSIEURS valeurs EXACTES. Quand vous testez la MÊME variable contre plusieurs valeurs possibles précises, le switch est plus LISIBLE qu'une longue cascade de elseif ($x === 'a') ... elseif ($x === 'b') .... Exemple : switch ($jour) { case 'lundi': ...; case 'mardi': ...; default: ... }. Attention : le switch compare avec == (lâche) — un point à connaître ; et n'oubliez pas les break (sinon « fall-through » dans le case suivant). Le switch brille pour un aiguillage sur les valeurs d'une variable, mal adapté aux conditions complexes ou aux plages. (3) ternaire (? :) — pour un if/else SIMPLE qui RENVOIE une valeur. Quand vous voulez AFFECTER une valeur selon une condition, de façon concise : $statut = $age >= 18 ? 'majeur' : 'mineur';. C'est court et lisible POUR DES CAS SIMPLES. Ne l'utilisez PAS pour de la logique complexe ni imbriquée (des ternaires imbriqués sont illisibles — un anti-pattern) ; dans ce cas, un if/else classique est plus clair. Le ternaire est pour les affectations conditionnelles courtes et évidentes. (4) match (PHP 8+) — un switch MODERNE qui RENVOIE une valeur. C'est une amélioration du switch : il compare en STRICT (===, plus sûr), RENVOIE une valeur (comme le ternaire mais pour plusieurs cas), n'a pas besoin de break (pas de fall-through), et peut lever une erreur si aucun cas ne correspond (plus sûr). Exemple : $prix = match($taille) { 'S' => 10, 'M' => 15, 'L' => 20, default => 0 };. Utilisez match (si vous êtes en PHP 8+) pour aiguiller sur les valeurs d'une variable EN RENVOYANT une valeur — c'est souvent plus propre et sûr que switch ou qu'une cascade de ternaires. (5) ?? (null coalescent) — pour les VALEURS PAR DÉFAUT. Cas spécifique mais fréquent : renvoyer une valeur si elle existe (et n'est pas null), sinon une valeur par défaut. $page = $_GET['page'] ?? 1; (la page demandée, ou 1 par défaut si absente). Très utile et concis pour gérer les valeurs absentes/nulles, notamment les paramètres de requête. La grille de décision : (1) Conditions VARIÉES/complexes, plages, logique → if/elseif/else. (2) UNE variable comparée à plusieurs valeurs exactes (aiguillage), sans renvoyer de valeur → switch (ou match). (3) UNE variable comparée à plusieurs valeurs, EN RENVOYANT une valeur → match (PHP 8+, préféré) ou switch. (4) if/else SIMPLE renvoyant une valeur → ternaire. (5) Valeur par défaut si absente/null → ??. Le principe directeur : choisissez la structure qui exprime le plus CLAIREMENT votre intention. Une longue cascade de elseif sur une même variable → switch/match (plus lisible). Un ternaire complexe/imbriqué → if/else classique (plus clair). Un aiguillage qui renvoie une valeur → match. Une valeur par défaut → ??. La LISIBILITÉ prime : le bon choix est celui qui rend le code le plus compréhensible pour la situation. En résumé : if/elseif/else pour le cas général et les conditions variées/complexes ; switch (ou match) pour aiguiller sur les valeurs exactes d'une variable ; ternaire pour un if/else simple qui affecte une valeur ; match (PHP 8+) pour un aiguillage moderne, strict et qui renvoie une valeur ; ?? pour les valeurs par défaut. Choisissez selon la nature de la condition et la lisibilité. Avec l'expérience, le bon choix devient naturel — l'objectif est toujours un code clair qui exprime l'intention sans détour.
Qu'est-ce que les valeurs « falsy » en PHP, et pourquoi peuvent-elles causer des bugs ?
Les valeurs « falsy » (considérées comme « fausses » dans un contexte booléen) sont un concept important en PHP, et mal les comprendre cause des bugs subtils — voici lesquelles et comment les gérer sûrement. Le principe : quand PHP évalue une valeur dans un contexte booléen (une condition if, une boucle while, avec &&/||), il détermine si elle est « vraie » ou « fausse ». Les valeurs booléennes true/false sont évidentes, mais PHP évalue AUSSI la « vérité » des autres types en les convertissant en booléen. Les valeurs « FALSY » (évaluées à FAUX) : (1) false (le booléen faux) ; (2) 0 (l'entier zéro) et 0.0 (le flottant zéro) ; (3) '' (la chaîne vide) ; (4) '0' (la chaîne contenant juste le caractère zéro — un piège !) ; (5) null (l'absence de valeur) ; (6) [] (le tableau vide). Toutes les AUTRES valeurs sont « TRUTHY » (évaluées à VRAI) : tout nombre non nul, toute chaîne non vide (SAUF '0'), tout tableau non vide, tout objet. Les BUGS que cela peut causer : (1) Le piège de '0'. La chaîne '0' est FALSY (contrairement à toute autre chaîne non vide). Donc if ($valeur) où $valeur vaut '0' (par exemple une saisie utilisateur « 0 », un identifiant « 0 ») est FAUX — ce qui peut être inattendu (« pourquoi mon code ignore la valeur 0 ? »). Un classique : vérifier si un champ de formulaire est rempli avec if ($_POST['champ']) — si l'utilisateur a saisi « 0 » (une réponse légitime), la condition est fausse et la valeur est traitée comme vide/absente. Bug ! (2) Le piège du 0 numérique. Si une fonction peut renvoyer 0 comme valeur LÉGITIME (par exemple, une position, un compte, un index qui peut valoir 0), un if ($resultat) traitera ce 0 comme « faux » — alors que 0 est une valeur valide. On confond alors « la valeur est 0 » et « il n'y a pas de valeur ». (3) Confusion entre ABSENCE et VALEUR FALSY. Le problème général : if ($x) ne distingue pas « $x n'existe pas / est null » de « $x vaut 0 ou '' ou '0' » — toutes ces situations sont « fausses », alors qu'elles ont des sens différents. Comment gérer SÛREMENT : (1) Soyez EXPLICITE dans vos conditions. Au lieu de if ($valeur) (qui dépend du falsy), testez PRÉCISÉMENT ce que vous voulez : (a) pour vérifier qu'une variable EXISTE et n'est pas null : if (isset($valeur)) ou if ($valeur !== null) ; (b) pour vérifier qu'une chaîne n'est pas vide : if ($chaine !== '') ; (c) pour une comparaison de valeur : utilisez === avec la valeur attendue (if ($x === 0)). Être explicite évite les surprises du falsy. (2) Utilisez isset() et empty() à bon escient : isset($x) vérifie que $x existe et n'est pas null (utile pour les paramètres de formulaire, tableaux) ; empty($x) vérifie que $x est « vide » (falsy) — mais attention, empty considère 0 et '0' comme vides (mêmes pièges), donc à utiliser en connaissant son comportement. (3) Pour les paramètres de formulaire (qui peuvent être absents), combinez : $valeur = $_POST['champ'] ?? ''; (récupère la valeur ou '' si absente, grâce à ??) puis testez explicitement. (4) Distinguez « absent/null » de « valeur falsy légitime » : si 0 ou '' sont des valeurs VALIDES dans votre contexte, ne les traitez pas comme « rien » — testez explicitement l'existence (isset) séparément de la valeur. (5) Le ?? (null coalescent) ne se déclenche que sur null/absence (pas sur les autres falsy), ce qui le rend PRÉCIS pour les valeurs par défaut sans le piège de 0/'' — $page = $_GET['page'] ?? 1; donne 1 seulement si 'page' est absent/null, pas si c'est 0 (contrairement à ?: qui se déclencherait sur tout falsy). En résumé : les valeurs « falsy » en PHP (false, 0, 0.0, '', '0', null, []) sont évaluées à « faux » dans les conditions. Les pièges classiques : '0' et 0 traités comme « rien » alors qu'ils peuvent être des valeurs légitimes, et la confusion entre « absent/null » et « valeur falsy ». Pour éviter les bugs : soyez EXPLICITE dans vos conditions (testez précisément ce que vous voulez : existence avec isset, non-null avec !== null, valeur exacte avec ===) plutôt que de vous reposer sur if ($x) ; connaissez le comportement de empty ; et utilisez ?? pour les valeurs par défaut (précis sur null/absence). Comprendre les falsy et être explicite dans vos conditions élimine des bugs subtils et rend votre logique fiable et prévisible — un point important de la maîtrise de PHP.