PHP opérateur ternaire null vs la coalescence de l'opérateur
Quelqu'un peut m'expliquer les différences entre l'opérateur ternaire abrégée (?:
) et nulle coalescence de l'opérateur (??
) en PHP?
Quand ils se comportent différemment et quand de la même façon (si cela arrive)?
$a ?: $b
VS.
$a ?? $b
Vous devez vous connecter pour publier un commentaire.
Lors de votre premier argument est nul, ils sont fondamentalement les mêmes, sauf que la valeur null coalescence de ne pas sortir un
E_NOTICE
lorsque vous avez une variable non définie. Le PHP 7.0 migration docs a ceci à dire:Voici un exemple de code pour le démontrer:
Les lignes qui ont les avis sont ceux où je suis en utilisant le raccourci opérateur ternaire, par opposition à la nulle la coalescence de l'opérateur. Cependant, même avec l'avis, PHP va donner la même réponse en retour.
Exécuter le code: https://3v4l.org/McavC
Bien sûr, c'est toujours en supposant que le premier argument est
null
. Lorsqu'il n'est plus nulle, alors vous vous retrouvez avec des différences dans la??
opérateur retourne toujours le premier argument alors que le?:
abréviation voudrais seulement si le premier argument est le truthy, et qui repose sur la façon dont PHP serait-type-cast choses à un booléen.Donc:
aurait alors
$a
être égal àfalse
et$b
égal à'g'
.Si vous utilisez le raccourci opérateur ternaire comme ça, il va provoquer un avis si
$_GET['username']
n'est pas définie:Ainsi, au lieu que vous avez à faire quelque chose comme ceci:
La null coalescence opérateur est équivalent à l'énoncé ci-dessus, et sera de retour "par défaut" si
$_GET['username']
n'est pas définie ou estnull
:Noter que il ne vérifie pas truthiness. Il vérifie seulement si elle est définie sur null.
Vous pouvez également le faire, et la première défini (ensemble et pas
null
) valeur sera retournée:Maintenant que c'est un bon coalescence de l'opérateur.
La différence majeure est que
Opérateur ternaire expression
expr1 ?: expr3
retourneexpr1
siexpr1
évalue àTRUE
mais d'un autre côté Null Coalescence Opérateur expression(expr1) ?? (expr2)
évalue à
expr1
siexpr1
est pasNULL
Ternaire
Opérateur
expr1 ?: expr3
émettent un avis si la gauchevaleur
(expr1)
n'existe pas mais d'un autre côté Null Coalescence Opérateur(expr1) ?? (expr2)
En particulier, n'émet pas un avis si le côté gauche de la valeur(expr1)
n'n'existe pas, tout comme
isset()
.TernaryOperator est associativité à gauche
Null Coalescence Opérateur est droit associatif
Maintenant permet d'expliquer la différence entre par exemple :
Opérateur Ternaire
(?:)
Null Coalescence Opérateur
(??)
Voici le tableau qui expliquent la différence et la similitude entre
'??'
et?:
Couru le ci-dessous sur php en mode interactif (
php -a
sur le terminal). Le commentaire sur chaque ligne affiche le résultat.Donc c'est mon interprétation:
1. Le Nul De La Coalescence De L'Opérateur
??
:??
est comme une "porte" qui ne laisse NULLE par.NULL
.??
est la même que( !isset() || is_null() )
2. L'Opérateur Ternaire -
?:
?:
est comme une porte qui vous permet deanything falsy
par - y comprisNULL
0
,empty string
,NULL
,false
,!isset()
,empty()
.. tout ce qui sent falsyecho ($x ? $x : false)
?:
va jeterPHP NOTICE
sur indéfini (unset
ou!isset()
) variables3. Alors, docteur, quand dois-je utiliser
??
et?:
..?:
quandempty($x)
vérifie!empty($x) ? $x : $y
peut être raccourcie à$x ?: $y
if(!$x) { fn($x); } else { fn($y); }
peut être raccourcie àfn(($x ?: $y))
??
quand!isset() || is_null()
vérifier$object = $object ?? new objClassName();
4. L'empilement des opérateurs ...
Opérateur ternaire peuvent être empilés ...
Source & crédit pour ce code
Ce qui est essentiellement une séquence d':
Null Coalese de l'Opérateur peuvent être empilés ...
C'est une séquence d':
À l'aide de l'empilement, je peux le raccourcir:
À ceci:
Cool, non? 🙂
Deux d'entre eux se comportent différemment quand il s'agit de dynamique de traitement des données.
Si la variable est vide ( " ) null la coalescence permettra de traiter la variable comme vrai, mais l'abréviation opérateur ternaire ne sera pas. Et c'est quelque chose à avoir à l'esprit.
Et la sortie:
Lien: https://3v4l.org/ZBAa1
Les deux sont des abréviations pour plus d'expressions.
?:
est court pour$a ? $a : $b
. Cette expression sera d'évaluer à $si $a donne VRAI.??
est court pourisset($a) ? $a : $b
. Cette expression sera d'évaluer à $si $a est définie sur null.Leurs cas d'utilisation des chevauchements lorsque $a n'est pas défini ou null. Lorsque $a n'est pas défini
??
ne produira pas un E_NOTICE, mais le résultat est le même. Lorsque $a est null, le résultat est le même.Faites défiler vers le bas sur cette lien et la vue de la section, il vous donne un comparatif exemple comme ci-dessous:
Cependant, il n'est pas conseillé de la chaîne d'opérateurs, il est plus difficile de comprendre le code lors de la lecture plus tard.
Essentiellement, à l'aide de la coalescence de l'opérateur permettra de faire de l'auto de vérifier la valeur null à la différence de l'opérateur ternaire.
a || b || c
modèle en JS, à l'exception de PHP peut être utilisé pour les booléens (false || 2
dans le JS est 2;false ?? 2
en PHP est faux)Il semble qu'il y a des avantages et des inconvénients à l'utilisation de
??
ou?:
. Le pro à l'aide de?:
est qu'elle évalue à false et null et "" le même. Le con, c'est qu'il signale une E_NOTICE si le précédent argument est nul. Avec??
le pro est qu'il n'y a pas de E_NOTICE, mais le con, c'est qu'il ne permet pas d'évaluer false et null le même. Dans mon expérience, j'ai vu des gens commencer à utiliser la valeur null et de faux, de façon interchangeable, mais ensuite, ils ont finalement recours à la modification de leur code soit compatible avec l'utilisation de null ou false, mais pas les deux. Une alternative est de créer une version plus élaborée condition ternaire:(isset($something) or !$something) ? $something : $something_else
.Ce qui suit est un exemple de la différence de l'utilisation de la
??
opérateur en utilisant à la fois nul et faux:En s'appuyant sur l'opérateur ternaire cependant, nous pouvons faire un faux ou une chaîne vide "" se comportent comme s'il s'agissait d'un nul sans jeter un e_notice:
Personnellement, je pense qu'il serait vraiment bien si un futur rev de PHP un autre opérateur new:
:?
qui a remplacé la syntaxe ci-dessus. c'est à dire://$var = $false :? "true";
Que la syntaxe d'évaluer la valeur null, false, "" équitablement et de ne pas jeter un E_NOTICE...?? null ?:
chose est assez impressionnant, je vous remercie, monsieur. gars intelligent.Pour les débutants:
Null coalescence de l'opérateur (??)
Tout est vrai, sauf
null
des valeurs et de l'indéfini (variable/index de tableau/les attributs de l'objet)ex:
c'est essentiellement la vérification de la variable(index de tableau, objet, attribut, etc...) est d'exister et de ne pas
null
. semblable àisset
fonctionOpérateur ternaire abrégée (?:)
toutes les choses fausses (
false
,null
,0
,chaîne vide) sont venus comme faux, mais si c'est un indéfini proviennent, elles aussi, comme faux, maisNotice
va jeterex
Espère que cette aide
Null Coalescing operator
effectue seulement deux tâches: il vérifiewhether the variable is set
etwhether it is null
. Regardez l'exemple suivant:Le code ci-dessus exemple stipule que
Null Coalescing operator
traite un non-existant variable et d'une partie variable qui est définie àNULL
de la même manière.Null Coalescing operator
est une amélioration par rapport à laternary operator
. Regardez l'extrait de code suivant en comparant les deux:Donc, la différence entre les deux est que
Null Coalescing operator
opérateur est conçu pour gérer des variables non définies mieux que leternary operator
. Attendu que, leternary operator
est un raccourci pourif-else
.Null Coalescing operator
n'est pas destiné à remplacerternary operator
, mais dans certains cas d'utilisation, comme dans l'exemple ci-dessus, il vous permet d'écrire du code propre avec moins de tracas.Crédits: http://dwellupper.io/post/6/php7-null-coalescing-operator-usage-and-examples
Lors de l'utilisation de la superglobales comme $_GET ou $_REQUEST vous devriez être conscients qu'ils pourraient être une chaîne vide.
Dans ce specal cas de cet exemple
va échouer parce que la valeur de $nom d'utilisateur est maintenant une chaîne vide.
Donc, lors de l'utilisation de $_GET ou même $_REQUEST vous devez utiliser l'opérateur ternaire place comme ceci:
Maintenant la valeur de $nom d'utilisateur est "nobody" comme prévu.