Le langage PHP offre quelques éléments de sucre syntaxique, ces petits raccourcis qu'on aime utiliser pour les opérations fréquentes.
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é :
$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.
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 :
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.
echo validerVariable($_POST['valeur']) ?: "Cette valeur n'est pas valide.";

Source de l'image originale : https://openclipart.org/download/232294/Elvis.svg
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 :
echo isset($maVariable) ? $maVariable : 'Valeur à afficher si null ou inexistant';
L'opérateur de fusion null simplifie cette expression :
echo $maVariable ?? 'Valeur à afficher si null ou inexistant';
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 :
ou
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.
$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 />';
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
« Elvis operator ». Wikipedia. https://en.wikipedia.org/wiki/Elvis_operator
▼Publicité