Aller au contenu principal

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 :

ValeurTypePourquoi falsy
falseboolfaux par définition
0intzéro entier
0.0floatzéro flottant
""stringchaîne vide
"0"stringchaîne contenant uniquement "0"
[]arraytableau vide
nullnullabsence 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é */ }
info

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".

attention

Ne pas confondre falsy et === false :

  • 0 == false est true (comparaison lâche, 0 est falsy)
  • 0 === false est false (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;
}
astuce

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.

info

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.

Bonne pratique - Parenthèses sur la condition

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';
remarque

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.

Bonne pratique - Elvis vs ternaire classique

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';
info

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;
remarque

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)
Bonne pratique - ?? avec $_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
attention

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


Quelle est la syntaxe correcte de l'opérateur ternaire en PHP ?


Que retourne l'opérateur Elvis (?:) si la valeur de gauche est falsy ?


Quelle est la différence principale entre ?: et ?? ?


Que vaut $x dans : $x = 0 ?? 'défaut'; ?


Que vaut $x dans : $x = 0 ?: 'défaut'; ?


Depuis quelle version de PHP l'opérateur ?? est-il disponible ?



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 %
Bonne pratique - Ternaires imbriqués

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

Bonne pratique - Lisibilité du ternaire

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