Formation PUB010 : PHP, 2025 Notions de programmation appliquées au PHP (référence)

56.12 Opérateur de fusion null « ?? » vs opérateur Elvis « ?: »


Le langage PHP offre quelques éléments de sucre syntaxique, ces petits raccourcis qu'on aime utiliser pour les opérations fréquentes.

Opérateur Elvis (?:)

L'opérateur Elvis (il porte ce nom puisqu'il ressemble à la coiffure d'Elvis ;-)) est un opérateur binaire qui permet de préciser une valeur à utiliser lorsque le premier opérande est évalué à false.

Il est disponible depuis PHP 5.3. On l'appelle parfois ternary shortcut.

Notez qu'une expression nulle est considérée comme fausse. 

Ceci peut être facilement vérifié :

PHP

$variableNull = null;
echo $variableNull == false;   // affiche 1

Donc, l'opérateur Elvis permet également de fournir une valeur de remplacement pour les valeurs nulles.

On a nommé l'opérateur ?: ainsi parce qu'il représente une émoticône typographique du toupet d'Elvis Presley. Penchez la tête vers la gauche et vous verrez!

Dans l'exemple qui suit, on utilise l'opérateur ternaire pour afficher une variable ou, si sa valeur est false, un texte de remplacement.

PHP

echo $maVariable ? $maVariable : 'Valeur à afficher si false';

Lorsqu'on retrouve la même chose comme premier et deuxième opérandes comme dans l'exemple précédent, on obtient le même résultat avec l'opérateur Elvis :

PHP

echo $maVariable ?: 'Valeur à afficher si false';

Si vous comparez les deux syntaxes, vous remarquerez qu'on a simplement omis le second opérande, soit celui situé entre les opérateurs « ? » et « : » puis qu'on a collé les deux opérateurs.

Voici un exemple plus pratique. Vous comprendrez pourquoi il est plus intéressant d'utiliser l'opérateur Elvis plutôt que de répéter le premier opérande avec l'opérateur ternaire.

PHP

echo validerVariable($_POST['valeur']) ?: "Cette valeur n'est pas valide.";

Opérateur Elvis

Source de l'image originale : https://openclipart.org/download/232294/Elvis.svg

Opérateur de fusion null (??)

L'opérateur de fusion null, parfois appelé opérateur null coalescent ou en anglais, null coalescing operator, a été introduit avec PHP 7.

Il s'agit ici aussi d'un opérateur binaire qui permet un raccourci d'une opération fréquemment réalisée avec l'opérateur ternaire.

Il est très semblable à l'opérateur Elvis. La différence, c'est qu'au lieu de préciser une expression de remplacement lorsque le premier opérande est évalué à false, il propose un remplacement lorsque le premier opérande est évalué null ou lorsqu'il est inexistant.

Avant l'arrivée de l'opérateur de fusion null, on utilisait l'opérateur ternaire comme suit :

PHP

echo isset($maVariable) ? $maVariable : 'Valeur à afficher si null ou inexistant';

L'opérateur de fusion null simplifie cette expression :

PHP

echo $maVariable ?? 'Valeur à afficher si null ou inexistant';

Quand est-ce que ?: donne un résutat différent de ??

Souvent, on obtiendra le même résultat avec l'opérateur Elvis et avec l'opérateur de fusion null.

Le résultat sera différent seulement si :

  • la variable contient la valeur false et est de type booléen (===) donc pas null

    ou

  • la variable est inexistante

J'ai préparé ce petit test pour vous le démontrer.

Remarquez l'utilisation des parenthèses. Elles sont essentielles lorsque l'opérateur ?? ou l'opérateur ?: est utilisé dans une expression qui utilise d'autres opérateurs (ici : la concaténation) puisqu'ils ont une priorité assez basse.

PHP

$variableFalse = false;
$variableNull = null;
$variableChaine = 'Annie';
$variableChaine2 = 'Annie';
$variableChaine3 = 'Martin';
$comparaisonEgalite = $variableChaine == $variableChaine2;
$comparaisonInegalite = $variableChaine == $variableChaine3;

echo '<br />Tests avec une variable à false<br />';
echo '******************************************************<br />';
echo '?? ' . ($variableFalse ?? 'test 1'); // affiche false (donc rien)
echo '<br />';
echo isset($variableFalse) ? $variableFalse :'test 2'; // équivalent du test 1
echo '<br />';
echo '?: ' . ($variableFalse ?: 'test 3'); // affiche test 3
echo '<br />';
echo $variableFalse ? $variableFalse :'test 4'; // équivalent du test 3
echo '<br />';

echo '<br />Tests avec une variable nulle<br />';
echo '******************************************************<br />';
echo '?? ' . ($variableNull ?? 'test 5'); // affiche test 5
echo '<br />';
echo isset($variableNull) ? $variableNull :'test 6'; // équivalent du test 5
echo '<br />';
echo '?: ' . ($variableNull ?: 'test 7'); // affiche test 7
echo '<br />';
echo $variableNull ? $variableNull :'test 8'; // équivalent du test 7
echo '<br />';

echo '<br />Tests avec une chaîne<br />';
echo '******************************************************<br />';
echo '?? ' . ($variableChaine ?? 'test 9'); // affiche Annie
echo '<br />';
echo isset($variableChaine) ? $variableChaine :'test 10'; // équivalent du test 9
echo '<br />';
echo '?: ' . ($variableChaine ?: 'test 11'); // affiche Annie
echo '<br />';
echo $variableChaine ? $variableChaine :'test 12'; // équivalent du test 11
echo '<br />';

echo '<br />Tests avec une variable inexistante<br />';
echo '******************************************************<br />';
echo '?? ' . ($variableInexistante ?? 'test 13'); // affiche test 13
echo '<br />';
echo isset($variableInexistante) ? $variableInexistante :'test 14'; // équivalent du test 13
echo '<br />';
echo '?: ' . ($variableInexistante ?: 'test 15'); // plante : Undefined variable: variableInexistante
echo '<br />';
echo $variableInexistante ? $variableInexistante :'test 16'; // équivalent du test 15

echo '<br />Tests avec une comparaison de variables égales<br />';
echo '******************************************************<br />';
echo '?? ' . ($comparaisonEgalite ?? 'test 17'); // affiche 1
echo '<br />';
echo isset($comparaisonEgalite) ? $comparaisonEgalite :'test 18'; // équivalent du test 17
echo '<br />';
echo '?: ' . ($comparaisonEgalite ?: 'test 19'); // affiche 1
echo '<br />';
echo $comparaisonEgalite ? $comparaisonEgalite :'test 20'; // équivalent du test 19
echo '<br />';

echo '<br />Tests avec une comparaison de variables inégales<br />';
echo '******************************************************<br />';
echo '?? ' . ($comparaisonInegalite ?? 'test 21'); // affiche faux (donc rien)
echo '<br />';
echo isset($comparaisonInegalite) ? $comparaisonInegalite :'test 22'; // équivalent du test 21
echo '<br />';
echo '?: ' . ($comparaisonInegalite ?: 'test 23'); // affiche test 23
echo '<br />';
echo $comparaisonInegalite ? $comparaisonInegalite :'test 24'; // équivalent du test 23
echo '<br />';

Résultat à l'écran

Tests avec une variable à false
******************************************************
??

?: test 3
test 4

Tests avec une variable nulle
******************************************************
?? test 5
test 6
?: test 7
test 8

Tests avec une chaîne
******************************************************
?? Annie
Annie
?: Annie
Annie

Tests avec une variable inexistante
******************************************************
?? test 13
test 14

Notice: Undefined variable: variableInexistante in ...php on line ...
?: test 15

Notice: Undefined variable: variableInexistante in ...php on line ...
test 16

Tests avec une comparaison de variables égales
******************************************************
?? 1
1
?: 1
1

Tests avec une comparaison de variables inégales
******************************************************
??

?: test 23
test 24

Pour plus d'information

« Elvis operator ». Wikipedia. https://en.wikipedia.org/wiki/Elvis_operator

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre