Elvis vs Null Coalescing : l'arme secrète du développeur PHP

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Elvis vs Null Coalescing : quel est le piège ? (Analyse approfondie PHP)

\n\n

Bonjour, collègue ! Si tu as déjà écrit du code en PHP, tu as sûrement été confronté à une situation où il faut vérifier si une variable existe, et si oui, utiliser sa valeur, sinon, lui attribuer une valeur par défaut. Une tâche en apparence simple, mais c'est justement là que les débutants (et les autres) trébuchent souvent sur deux opérateurs très similaires, mais fondamentalement différents : l'opérateur ternaire court (Elvis operator) ?: et l'opérateur null coalescing ??.

\n\n

C'est l'une des questions les plus populaires sur Stack Overflow (des milliers de vues et de votes). Et ce n'est pas pour rien : la différence entre les deux n'est pas qu'un simple intérêt académique. Une erreur dans le choix de l'opérateur peut entraîner des bugs que tu passeras des heures à traquer. Faisons le point une fois pour toutes sur ce qui se cache « sous le capot » et quand utiliser quoi.

\n\n

Brève introduction : pourquoi avons-nous besoin de ces opérateurs ?

\n\n

Imagine que tu écris du code pour afficher le nom d'un utilisateur. Si le nom n'existe pas, on affiche « Invité ». La méthode classique est d'utiliser if :

\n\n
if (isset($userName)) {\n    $displayName = $userName;\n} else {\n    $displayName = 'Invité';\n}
\n\n

Ça fonctionne, mais c'est lourd. PHP propose des raccourcis élégants. Et c'est là que nous arrivons au dilemme principal : ?: ou ?? ? À première vue, c'est la même chose. Mais seulement en apparence.

\n\n

1. Elvis operator (?:) — « Le roi des valeurs booléennes »

\n\n

L'opérateur Elvis (surnommé ainsi pour sa ressemblance avec la coiffure du roi du rock'n'roll : ?: — les yeux, le nez et la mèche) est apparu dans PHP dès la version 5.3. C'est une forme raccourcie de l'opérateur ternaire.

\n\n

Syntaxe :

\n
$result = $expression ?: $default;
\n\n

Qu'est-ce que cela signifie ? L'interpréteur examine $expression. Si elle est évaluée à true (c'est-à-dire qu'elle n'est pas une valeur « fausse »), alors $expression est retournée. Si $expression est une valeur « fausse » (false, 0, chaîne vide, null, tableau vide, etc.), alors $default est retournée.

\n\n

Nuance importante : L'opérateur Elvis ne vérifie pas si la variable existe. Il vérifie sa véracité. Si la variable n'est pas définie, tu obtiendras une Notice: Undefined index/variable.

\n\n

Exemple piège :

\n
$count = 0;\n$result = $count ?: 10;\necho $result; // Affiche 10, pas 0 !
\n\n

Pourquoi ? Parce que 0 est une valeur « fausse » (falsy). Elvis a considéré que la variable était « vide » et a renvoyé la valeur de secours. Pour beaucoup, c'est une surprise.

\n\n

2. Null Coalescing Operator (??) — « Le sauveur des Notice »

\n\n

L'opérateur null coalescing est apparu dans PHP 7.0 et a été accueilli avec enthousiasme. Son super-pouvoir principal est qu'il fonctionne en toute sécurité avec des variables inexistantes, sans générer d'erreurs.

\n\n

Syntaxe :

\n
$result = $expression ?? $default;
\n\n

Qu'est-ce que cela signifie ? L'opérateur vérifie si $expression existe et n'est pas égale à null. Si c'est le cas, il retourne $expression. Sinon, il retourne $default.

\n\n

Différence clé : ?? ignore toutes les valeurs « fausses », à l'exception de null et de l'indéfini (undefined). 0, "", false — tout cela est considéré comme des valeurs valides et sera retourné.

\n\n

Exemple :

\n
$count = 0;\n$result = $count ?? 10;\necho $result; // Affiche 0 ! Parce que la variable existe et n'est pas null.
\n\n

Tu vois la différence ? C'est le principal mécanisme « sous le capot ».

\n\n

3. Comparaison « sous le capot » : table de vérité

\n\n

Résumons tout cela dans un tableau clair pour bien assimiler. Soit

Blogs

Book Recommendations