Opérateur ternaire
Notions théoriques
La notion de "falsy"
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 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.
Son nom officiel 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.
L'opérateur Elvis (?:)
Introduit en PHP 5.3, l'opérateur Elvis est un raccourci du ternaire. Il 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';
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 de fusion null (??)
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';
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 ou 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 parenthéser explicitement :
$x = ($a ? $b : $c) ? $d : $e;
Pour plus de deux branches, préférer if/elseif/else ou l'expression match (PHP 8+).
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.
Étape 1 — Créer le répertoire et le fichier
Dans votre répertoire "Documents", créez le répertoire tp_operateur_ternaire, puis le fichier reduction.php :
mkdir tp_operateur_ternaire
cd tp_operateur_ternaire
touch reduction.php
Étape 2 — Initialiser les variables
Ouvrez reduction.php et ajoutez les variables suivantes :
<?php
$total = 120; // Montant total de la commande (en euros)
$estMembre = true; // L'utilisateur est-il membre du programme fidélité ?
$codePromo = null; // Code promo (null si aucun code saisi)
$prenom = 'Alice'; // Prénom de l'utilisateur
Étape 3 — Calculer le 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 4 — Utiliser ?? pour le code promo
Utilisez l'opérateur de fusion null pour afficher le code promo s'il est défini, sinon 'aucun' :
Étape 5 — Calculer le montant de la réduction et le prix final
Ajoutez les deux calculs suivants :
Étape 6 — Afficher le récapitulatif complet
Complétez l'affichage avec toutes les informations de la commande :
Étape 7 — Exécuter le script
Exécutez votre script et vérifiez les résultats :
php reduction.php
Résultats attendus
Bonjour Alice !
Commande : 120 EUR
Code promo : aucun
Reduction appliquee : 15% (-18 EUR)
Prix final : 102 EUR
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/else ou un match (PHP 8+). L'opérateur ternaire est idéal pour des cas simples à deux branches.
Une solution
Vous devez être connecté pour voir le contenu.