Les avantages de l'opérateur NULL coalecing en PHP 7

Contribué par Sylvain Lavielle le 13/06/2019

L'opérateur NULL coalecing  est une des nouvelles fonctionnalités disponibles depuis PHP 7.0 . Derrière ce nom un peu barbare se cache un opérateur très pratique qui permet de définir la valeur par défaut d'une variable lorsque celle-ci n'est pas définie. Mine de rien, c'était une vraie lacune du language PHP car cet opérateur existe dans presque tous les languages.

Cependant, comme c'est un opérateur relativement récent, les développeurs PHP l'utilisent encore assez peu, et c'est dommage car il est très pratique et élégant.

Principe de fonctionnement

Concrètement, voici de quoi il s'agit :

$userRole = $_SESSION['user_role'] ?? 'unautenticated'

Si la variable $_SESSION['user_role'] n'est pas définie ou est égale à NULL, la valeur utilisée est donc la valeur de substitution fournie, ici 'unautenticated'

Comparaison avec l'opérateur ternaire

Ça n'a l'air de rien mais avant il fallait utiliser un opérateur ternaire pour faire la même chose avec une syntaxe plus chargée :

$username = isset($_SESSION['user_role']) ? $_SESSION['user_role'] : 'unautenticated';

Il exite une forme plus simple et plus compacte pour l'opérateur ternaire qui ressemble beaucoup au NULL coalescing operator :

$userRole = $_SESSION['user_role'] ?: 'unautenticated';

Cependant celui-ci dispose d'un petit défaut bien embêtant : si la variable à gauche de l'opérateur n'est pas définie (en clair si la clef "user_role" n'existe pas dans l'array $_SESSION), PHP va produire une erreur de type notice. On est donc contraint d'utiliser la première forme de l'opérateur ternaire et de protéger en utilisant un isset(_SESSION['user_role']) évitant ainsi l'erreur PHP.

L'opérateur NULL coalescent quant à lui n'a pas ce problème et utiliser une variable non définie ne lui posera aucun souci. C'est là un grand avantage par rapport à son cousin l'opérateur ternaire.

Utilisation dans un else ... if

L'opérateur NULL coalescing peut bien sur s'utiliser dans un if...else évitant ainsi le recours à un opérateur ternaire avec un isset :

if (($_SESSION['user_role'] ?? NULL) === 'autenticated') { 
  ... 
} 

Cependant il y a une petite subtilité à prendre en compte. Comme on peut le voir celui-ci est entouré de parenthèses. C'est parce que la priorité des opérateurs de PHP accorde une précédence supérieure à l'opérateur d'égalité (===) par rapport à l'opérateur NULL Coalecing (??). Ainsi donc si on oublie la parenthèse et qu'on écrit ceci :

if ($_SESSION['user_role'] ?? NULL === 'autenticated') {
  ... 
} 

le fonctionnement ne sera alors pas du tout le comportement souhaité.

Chainage

L'opérateur NULL coalescing peut se chainer et produit une syntaxe très lisible :

$options = $_SESSION['user_options'] ?? $userPreferedOptions ?? $userDefaultOptions;

En résumé

En résumé, l'opérateur NULL coalescing peut se révéler bien utile et évite souvent d'avoir recours à une syntaxe plus lourde et inélégante qui nuit à la lisibilité du code.

 

 

Étiquettes