Opérateur ternaire

Notions théoriques
L'opérateur ternaire
L'opérateur ternaire est une version condensée d'un if...else. Il permet d'affecter une valeur à une variable selon une condition, en une seule ligne.
Syntaxe :
$resultat = condition ? valeurSiVrai : valeurSiFaux;
C'est équivalent à :
if (condition) {
$resultat = valeurSiVrai;
} else {
$resultat = valeurSiFaux;
}
L'opérateur ternaire tire son nom du fait qu'il prend trois opérandes : la condition, la valeur si vraie, et la valeur si fausse.
📌 Terme officiel : opérateur conditionnel
Le nom officiel de l'opérateur ternaire est opérateur conditionnel. Le terme "ternaire" vient du latin ternarius ("qui contient trois"). C'est le seul opérateur PHP à prendre trois opérandes — tous les autres en prennent un ou deux.
Encadrer la condition de parenthèses (condition) : ce n'est pas obligatoire, mais cela améliore la lisibilité et évite les ambiguïtés avec les opérateurs de priorité basse.
Quand plusieurs opérateurs ternaires sont combinés ou imbriqués, les parenthèses sont indispensables pour définir l'ordre d'évaluation. Sans elles, PHP 8 lève une erreur :
// Ambigu — erreur en PHP 8 :
$x = $a ? $b : $c ? $d : $e;
// Explicite et lisible :
$x = ($a ? $b : $c) ? $d : $e;
Règle simple : une paire de parenthèses par ternaire dès qu'il y en a plusieurs.
📌 La notion de "falsy" (complément)
En PHP (comme dans la plupart des langages), une valeur est dite falsy si elle est considérée comme fausse dans un contexte booléen — c'est-à-dire dans un if, un while, ou un opérateur conditionnel.
Les valeurs falsy en PHP sont :
| Valeur | Type | Pourquoi falsy |
|---|---|---|
false | bool | faux par définition |
0 | int | zéro entier |
0.0 | float | zéro flottant |
"" | string | chaîne vide |
"0" | string | chaîne contenant uniquement "0" |
[] | array | tableau vide |
null | null | absence de valeur |
Toute autre valeur est truthy (considérée comme vraie).
if (0) { /* jamais exécuté */ }
if ("") { /* jamais exécuté */ }
if (null) { /* jamais exécuté */ }
if (42) { /* exécuté */ }
if ("PHP") { /* exécuté */ }
if ([1,2]) { /* exécuté */ }
Les termes falsy et truthy ne sont pas des mots français — ce sont des anglicismes issus de la programmation, universellement utilisés par les développeurs. On dit qu'une valeur "est falsy" ou "est truthy".
Ne pas confondre falsy et === false :
0 == falseesttrue(comparaison lâche, 0 est falsy)0 === falseestfalse(comparaison stricte, types différents)
Toujours préférer === pour les comparaisons explicites à false ou null.
L'opérateur ?:
Introduit en PHP 5.3, l'opérateur ?: retourne la valeur de gauche si elle est vraie (non nulle, non vide, non zéro), sinon il retourne la valeur de droite.
$resultat = $variable ?: 'valeur par défaut';
C'est équivalent à :
$resultat = $variable ? $variable : 'valeur par défaut';
📌 Surnom humoristique : opérateur Elvis
Pourquoi "Elvis" ?
Le symbole ?:, lu verticalement, ressemble au visage d'Elvis Presley avec sa célèbre mèche : le ? forme l'œil et la coiffure, le : le menton. Ce surnom humoristique vient de la communauté des développeurs Perl, d'où PHP l'a repris.
Utiliser ?: uniquement quand la valeur à tester est aussi la valeur à retourner en cas de succès. Dès que la valeur vraie est différente de la condition, revenir au ternaire classique ? : .
L'opérateur ??
Introduit en PHP 7, l'opérateur ?? retourne la valeur de gauche si elle est définie et non nulle, sinon il retourne la valeur de droite.
$resultat = $variable ?? 'valeur par défaut';
📌 Terme officiel : opérateur de coalescence nulle
Terminologie : ?? s'appelle officiellement opérateur de coalescence nulle (anglais : null coalescing operator).
Le mot coalescence vient du latin coalescere ("croître ensemble") : il "fusionne" une valeur potentiellement nulle avec une valeur par défaut.
Il existe aussi depuis PHP 7.4 l'opérateur ??= (affectation de coalescence nulle) : il n'affecte la valeur de droite que si la variable de gauche est null ou indéfinie.
// Sans ??= :
$config['timeout'] = $config['timeout'] ?? 30;
// Avec ??= :
$config['timeout'] ??= 30;
Différence entre ?: et ?? :
?:teste si la valeur est falsy (null, false, 0, "", [])??teste uniquement si la valeur est null (indéfinie)
$note = 0;
echo $note ?: 'pas de note'; // "pas de note" (0 est falsy)
echo $note ?? 'pas de note'; // "0" (0 est défini et non null)
$_GET et $_POST?? est particulièrement utile pour lire des paramètres de formulaire ou d'URL, qui peuvent ne pas exister :
// Au lieu de :
$page = isset($_GET['page']) ? $_GET['page'] : 1;
// Écrire simplement :
$page = $_GET['page'] ?? 1;
Exemple pratique
<?php
$age = 20;
$pseudo = null;
$solde = 0;
// Opérateur ternaire : majeur ou mineur ?
$statut = ($age >= 18) ? 'majeur' : 'mineur';
echo $statut; // majeur
// Opérateur Elvis : utilise $pseudo s'il est non vide, sinon 'Anonyme'
$nom = $pseudo ?: 'Anonyme';
echo $nom; // Anonyme
// Opérateur de fusion null : utilise $solde même s'il vaut 0
$affichageSolde = $solde ?? 'solde inconnu';
echo $affichageSolde; // 0
PHP 8 — L'enchaînement de ternaires sans parenthèses est déprécié
En PHP < 8, les ternaires enchaînés étaient évalués de gauche à droite (associativité gauche), source de bugs silencieux. Depuis PHP 8, cet enchaînement sans parenthèses explicites lève une erreur :
// ❌ Déprécié / erreur en PHP 8 :
$x = $a ? $b : $c ? $d : $e;
// ✅ Toujours mettre des parenthèses pour clarifier l'ordre d'évaluation :
$x = ($a ? $b : $c) ? $d : $e;
Pour plus de 2 comparaisons, préférer if/elseif/else ou l'expression switch.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Calcul de réduction pour une boutique en ligne
Dans ce TP, vous allez créer un script PHP qui calcule la réduction appliquée à une commande en utilisant l'opérateur ternaire et l'opérateur de fusion null.
Objectifs du TP
- Utiliser l'opérateur ternaire pour appliquer une logique conditionnelle.
- Utiliser l'opérateur de fusion null
??pour gérer des valeurs optionnelles. - Combiner plusieurs conditions avec les opérateurs ternaires.
Dans votre répertoire "Documents", créez le répertoire tp_operateur_ternaire, entrez dans ce répertoire puis créez le fichier reduction.php.
Étape 1 — Initialiser les variables
Ouvrez reduction.php et ajoutez les variables suivantes :
<?php
// Étape 1 : initialiser les variables
$prenom = 'Alice'; // Prénom de l'utilisateur
$total = 90; // Montant total de sa commande (en euros)
$estMembre = true; // L'utilisateur est-il membre du programme fidélité ?
Étape 2 — Calculer le taux de réduction
Calcul du taux de réduction avec un opérateur ternaire
Ajoutez le calcul du taux de réduction selon les règles suivantes :
- Si le client est membre et que la commande dépasse 100 € → réduction de 15 %
- Sinon si le client est membre → réduction de 10 %
- Sinon → réduction de 0 %
Parenthéser chaque ternaire imbriqué pour lever l'ambiguïté et faciliter la lecture. Au-delà de deux niveaux d'imbrication, préférer if/elseif/else.
Étape 3 — Afficher le code promo
Utilisez l'opérateur ?? pour afficher le code promo s'il est défini, sinon 'aucun' :
Étape 4 — Calculer le prix final
Calcul du montant de la réduction et du prix final
Ajoutez les 2 calculs suivants :
Étape 5 — Afficher le récapitulatif
Ajoutez les lignes d'affichage pour présenter toutes les informations de la commande dans un ordre logique :
Exécuter le script
Exécutez votre script et vérifiez les résultats :
php reduction.php
📌 Résultats attendus
Bonjour Alice !
Commande : 90 EUR
Code promo : aucun
Réduction appliquée : 10 % (-9 EUR)
Prix final : 81 EUR
- L'opérateur ternaire est idéal pour des cas simples.
- Ne pas imbriquer plus de deux opérateurs ternaires sur une seule ligne : cela nuit gravement à la lisibilité. Si la logique est complexe, préférer un
if/elseif/elseou unswitch.