?? renvoie la valeur à sa gauche si elle existe et ne vaut pas null, sinon la valeur à sa droite : $name = $_GET['name'] ?? 'Guest';. Contrairement à une lecture directe de la clé, il n'affiche jamais de warning quand la variable ou la clé de tableau manque.
À la première exécution, il n'y a pas de query string, donc les deux valeurs par défaut sont utilisées. Cliquez sur un lien de l'onglet Page et le script s'exécute à nouveau avec $_GET rempli. Lire $_GET["name"] sans ?? lors de cette première exécution afficherait Warning: Undefined array key "name" sur une configuration PHP normale. Les données de requête sont détaillées sur la page _POST.
?? est un raccourci de isset()
$a ?? $b signifie exactement isset($a) ? $a : $b. Il fonctionne sur les variables, les clés de tableau à n'importe quelle profondeur et les propriétés d'objet, et il s'arrête sans se plaindre au premier élément manquant.
La vérification est la même que celle de isset, donc une clé qui existe avec la valeur null prend aussi la valeur par défaut.
Enchaîner des ?? pour essayer plusieurs sources
?? est associatif à droite et vous pouvez en enchaîner autant que vous voulez. PHP renvoie le premier opérande défini et différent de null.
??= n'affecte que si la valeur est null
$a ??= $b stocke $b dans $a seulement si $a n'est pas défini ou vaut null. C'est la façon la plus courte de remplir des valeurs par défaut ou de calculer quelque chose une seule fois pour le réutiliser.
Le côté droit de ??= n'est évalué que quand l'affectation a lieu, c'est pourquoi computing 4 n'apparaît qu'une fois.
?? ou ?: (ternaire court)
?? teste null. ?: teste si la valeur est évaluée à vrai. Avec des valeurs comme 0, "" et "0", ils donnent des réponses différentes :
Une quantité de "0" est une vraie saisie : ?? la garde, ?: la remplace. ?: seul afficherait un warning pour la clé manquante, c'est pourquoi le bloc l'écrit ($inputs[$key] ?? null) ?: .... La page sur l'opérateur ternaire traite de ?: lui-même.
L'opérateur nullsafe ?->
?-> est la version objet de la même idée, ajoutée en PHP 8. Si l'objet de gauche vaut null, toute la chaîne s'arrête et renvoie null au lieu de lever une Error comme Call to a member function getAddress() on null. Ajoutez ?? à la fin pour une valeur par défaut.
L'utilisateur 2 existe mais n'a pas d'adresse, et l'utilisateur 3 n'existe pas du tout. Les deux arrivent à la valeur par défaut ?? "unknown" sans erreur.
Erreur fréquente : ?? a une faible priorité
?? est moins prioritaire que . et les opérateurs arithmétiques. Dans "Count: " . $count ?? 0, PHP construit donc d'abord la chaîne "Count: " . $count, qui ne vaut jamais null, et la valeur par défaut n'est jamais utilisée.
Entourez l'expression ?? de parenthèses chaque fois qu'elle se trouve dans une expression plus grande.
Questions fréquentes
Que signifie ?? en PHP ?
?? est l'opérateur de fusion null. $a ?? $b renvoie $a s'il existe et ne vaut pas null, sinon $b. C'est le raccourci de isset($a) ? $a : $b, et il ne déclenche pas de warning quand $a ou une clé de tableau n'est pas définie.
Quelle est la différence entre ?? et ?: en PHP ?
?? ne se rabat sur la droite que si le côté gauche vaut null ou n'est pas défini, donc 0 ?? 5 vaut 0 et '' ?? 'x' vaut ''. ?: se rabat dès que le côté gauche est évalué à faux, donc 0 ?: 5 vaut 5. ?: affiche aussi des warnings pour les variables et clés non définies, pas ??.
Que fait ??= en PHP ?
$a ??= $b affecte $b à $a seulement si $a vaut null ou n'est pas défini ; sinon il laisse $a tel quel. C'est le raccourci de $a = $a ?? $b;, ajouté en PHP 7.4.
Qu'est-ce que l'opérateur nullsafe ?-> en PHP ?
$obj?->method() n'appelle la méthode que si $obj ne vaut pas null ; s'il vaut null, toute la chaîne renvoie null au lieu de lever une erreur. Combinez-le avec ?? pour une valeur par défaut : $user?->getAddress()?->city ?? 'unknown'. Il a été ajouté en PHP 8.0.