L'opérateur ternaire est un if/else qui tient dans une expression : condition ? valueIfTrue : valueIfFalse. Il renvoie l'une des deux valeurs, vous pouvez donc l'affecter, l'afficher avec echo ou la passer à une fonction.
Mettez $age à 15 et $items à 3 et relancez. Remarquez les parenthèses autour du ternaire sur la dernière ligne : sans elles, le . assemblerait d'abord les chaînes et le résultat ne serait pas celui voulu.
Le ternaire dans les templates HTML
Un ternaire est la façon habituelle de choisir une classe CSS, un libellé ou un attribut dans un template. Ce bloc lit ?stock= dans l'URL : exécutez-le, puis cliquez sur les liens de l'onglet Page et le même script s'exécute à nouveau avec une autre valeur.
<?= ... ?> est le raccourci de <?php echo ... ?>, ce qui garde lisibles les conditions sur une ligne au milieu du balisage.
Le ternaire court ?: (l'opérateur Elvis)
Omettez la partie du milieu et vous obtenez $a ?: $b : il renvoie $a quand $a est évalué à vrai, sinon $b. C'est pratique pour des valeurs par défaut quand une chaîne vide ou 0 doivent aussi déclencher le repli.
Les valeurs évaluées à faux sont false, 0, 0.0, "", "0", [] et null. Si "0" est une vraie réponse dans vos données (un champ de quantité, un code PIN), le ternaire court la jettera.
?: ou ??
Ils se ressemblent mais ne vérifient pas la même chose. ?: se rabat sur la valeur de droite quand le côté gauche est évalué à faux. ?? ne le fait que quand le côté gauche est null ou non défini, et il n'affiche pas de warning pour une variable ou une clé de tableau manquante.
Utilisez ?? pour « la valeur n'existe peut-être pas » (données de requête, tableaux de configuration, clés facultatives). Utilisez ?: pour « la valeur existe mais peut être vide ». La page sur l'opérateur de fusion null détaille ?? et ??=.
Un ternaire imbriqué exige des parenthèses
PHP 7 lisait a ? b : c ? d : e de gauche à droite, contrairement à presque tous les autres langages, et produisait des résultats faux. PHP 8 refuse de deviner :
<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2
Ajoutez des parenthèses autour du ternaire intérieur et cela fonctionne :
Le ternaire court fait exception : $a ?: $b ?: $c est autorisé sans parenthèses, comme dans l'exemple Elvis plus haut.
Utiliser match(true) au-delà de deux branches
Un ternaire imbriqué sur trois ou quatre niveaux est difficile à lire, même avec des parenthèses. match avec true comme sujet vérifie les conditions de haut en bas et renvoie la première branche qui correspond :
Gardez le ternaire pour deux résultats sur une ligne, et passez à match ou à une suite if/elseif dès qu'il vous en faut un troisième.
Questions fréquentes
Qu'est-ce que l'opérateur ternaire en PHP ?
Une forme courte de if/else qui renvoie une valeur : $label = $age >= 18 ? 'adult' : 'minor';. Si la condition avant ? est vraie, l'expression après ? est utilisée, sinon celle après :.
Que signifie ?: en PHP ?
$a ?: $b est le ternaire court (aussi appelé opérateur Elvis). Il renvoie $a si $a est évalué à vrai et $b sinon, donc '' ?: 'default' vaut 'default'. C'est la même chose que $a ? $a : $b, mais $a n'est évalué qu'une fois.
Peut-on imbriquer des opérateurs ternaires en PHP ?
Seulement avec des parenthèses. Depuis PHP 8, $a ? 'x' : $b ? 'y' : 'z' est une erreur fatale, il faut donc écrire $a ? 'x' : ($b ? 'y' : 'z'). Au-delà de deux branches, match(true) ou une suite if/elseif se lit plus facilement.
Peut-on utiliser un ternaire sans la partie else ?
Non, le ternaire exige toujours les deux branches. Pour « utiliser cette valeur ou une valeur de repli », écrivez $x ?: 'default' ou $x ?? 'default' ; pour n'agir que si une condition est remplie, écrivez un if normal ou $condition && doSomething();.