Lorsque votre premier argument est nul, ils sont fondamentalement les mêmes, sauf que la fusion nulle ne produira pas E_NOTICE
lorsque vous avez une variable non définie. La documentation de migration PHP 7.0 a ceci à dire:
L'opérateur de coalescence nul (??) a été ajouté en tant que sucre syntaxique dans le cas courant de la nécessité d'utiliser un ternaire en conjonction avec isset (). Il renvoie son premier opérande s'il existe et n'est pas NULL; sinon, elle renvoie son deuxième opérande.
Voici un exemple de code pour illustrer cela:
<?php
$a = null;
print $a ?? 'b'; // b
print "\n";
print $a ?: 'b'; // b
print "\n";
print $c ?? 'a'; // a
print "\n";
print $c ?: 'a'; // Notice: Undefined variable: c in /in/apAIb on line 14
print "\n";
$b = array('a' => null);
print $b['a'] ?? 'd'; // d
print "\n";
print $b['a'] ?: 'd'; // d
print "\n";
print $b['c'] ?? 'e'; // e
print "\n";
print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33
print "\n";
Les lignes qui ont l'avis sont celles où j'utilise l'opérateur ternaire raccourci par opposition à l'opérateur coalescent nul. Cependant, même avec l'avis, PHP donnera la même réponse.
Exécutez le code: https://3v4l.org/McavC
Bien sûr, cela suppose toujours que le premier argument est null
. Une fois qu'il n'est plus nul, vous vous retrouvez avec des différences dans la mesure où l' ??
opérateur renvoie toujours le premier argument tandis que la ?:
sténographie ne le fait que si le premier argument est véridique, et cela dépend de la façon dont PHP transtyperait les choses en booléen .
Alors:
$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'
aurait alors $a
été égal false
et $b
égal à 'g'
.
$b = []; var_dump($b['a']['b']['c'] ?? 'default');
ou avec des objets$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
$a = [];
. Voir: 3v4l.org/iCCa0Exécuté ci-dessous en mode interactif php (
php -a
sur le terminal). Le commentaire sur chaque ligne montre le résultat.Voici donc mon interprétation:
1. L'opérateur de coalescence nul -
??
:??
est comme une "porte" qui ne laisse passer que NULL .NULL
.??
même chose que( !isset() || is_null() )
2. L'opérateur ternaire -
?:
?:
est comme une porte qui laisseanything falsy
passer - y comprisNULL
0
,empty string
,NULL
,false
,!isset()
,empty()
.. tout ce qui sent falsyecho ($x ? $x : false)
?:
lancera des variablesPHP NOTICE
non définies (unset
ou!isset()
)3. Alors docteur, quand dois-je utiliser
??
et?:
..?:
quandempty($x)
vérifications!empty($x) ? $x : $y
peut être raccourcie à$x ?: $y
if(!$x) { fn($x); } else { fn($y); }
peut être raccourci enfn(($x ?: $y))
??
quand!isset() || is_null()
chèque$object = $object ?? new objClassName();
4. Opérateurs d'empilage ...
L'opérateur ternaire peut être empilé ...
Source et crédit pour ce code
Il s'agit essentiellement d'une séquence de:
Null Coalese Operator peut être empilé ...
Il s'agit d'une séquence de:
En utilisant l'empilement, je peux raccourcir ceci:
Pour ça:
Cool, non? :-)
la source
Si vous utilisez l'opérateur de raccourci ternaire comme celui-ci, il provoquera un avis s'il
$_GET['username']
n'est pas défini:Au lieu de cela, vous devez faire quelque chose comme ceci:
L' opérateur de coalescence nul est équivalent à l'instruction ci-dessus, et retournera 'par défaut' s'il
$_GET['username']
n'est pas défini ou estnull
:Notez qu'il ne vérifie pas la véracité . Il vérifie uniquement s'il est défini et non nul.
Vous pouvez également le faire, et la première valeur définie (définie et non
null
) sera retournée:Maintenant, c'est un bon opérateur de coalescence.
la source
La principale différence est que
L' expression d' opérateur ternaire
expr1 ?: expr3
retourneexpr1
siexpr1
évalue àTRUE
mais d'autre part l' expression d' opérateur de coalescence nulle est(expr1) ?? (expr2)
évaluée àexpr1
siexpr1
n'est pasNULL
L'opérateur ternaire
expr1 ?: expr3
émet une notification si la valeur du côté gauche(expr1)
n'existe pas mais, d'autre part, l' opérateur de coalescence nulle(expr1) ?? (expr2)
en particulier, n'émet pas de notification si la valeur du côté gauche(expr1)
n'existe pas, tout commeisset()
.TernaryOperator est laissé associatif
Null Coalescing Operator est à droite associative
Expliquons maintenant la différence entre par exemple:
Opérateur ternaire
(?:)
Opérateur de coalescence nul
(??)
Voici le tableau qui explique la différence et la similitude entre
'??'
et?:
la source
Les deux se comportent différemment en ce qui concerne la gestion dynamique des données.
Si la variable est vide (''), la coalescence nulle traitera la variable comme vraie, mais l'opérateur ternaire abrégé ne le fera pas. Et c'est quelque chose à avoir en tête.
Et la sortie:
Lien: https://3v4l.org/ZBAa1
la source
It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
.Les deux sont des raccourcis pour des expressions plus longues.
?:
est l'abréviation de$a ? $a : $b
. Cette expression sera évaluée à $ a si $ a est évaluée à TRUE .??
est l'abréviation deisset($a) ? $a : $b
. Cette expression sera évaluée à $ a si $ a est définie et non nulle.Leurs cas d'utilisation se chevauchent lorsque $ a n'est pas défini ou est nul. Lorsque $ a n'est pas défini
??
, aucun E_NOTICE ne sera produit, mais les résultats seront les mêmes. Lorsque $ a est nul, le résultat est le même.la source
Pour les débutants:
Opérateur coalescent nul (??)
Tout est vrai sauf les
null
valeurs et indéfinies (variable / index de tableau / attributs d'objet)ex:
il s'agit essentiellement de vérifier que la variable (index du tableau, attribut d'objet .. etc.) existe et non
null
. similaire à laisset
fonctionRaccourci opérateur ternaire (? :)
toutes choses fausses (
false
,null
,0
, chaîne vide) sont venus comme faux, mais si elle est un non défini VIENS aussi faux , maisNotice
jetterontex
J'espère que cela t'aides
la source
Faites défiler vers le bas sur ce lien et consultez la section, il vous donne un exemple comparatif comme indiqué ci-dessous:
Cependant, il n'est pas conseillé de chaîner les opérateurs car cela rend plus difficile la compréhension du code lors de sa lecture ultérieure.
Essentiellement, l'utilisation de l'opérateur de fusion fera en sorte qu'il vérifie automatiquement la valeur null contrairement à l'opérateur ternaire.
la source
a || b || c
modèle courant dans JS, sauf que PHP peut être utilisé pour les booléens (false || 2
dans JS est 2;false ?? 2
dans PHP est faux)Les autres réponses vont en profondeur et donnent de grandes explications. Pour ceux qui recherchent une réponse rapide,
$a ?: 'fallback'
est$a ? $a : 'fallback'
tandis que
$a ?? 'fallback'
est$a = isset($a) ? $a : 'fallback'
La principale différence serait lorsque l'opérateur de gauche est:
0
,''
,false
,[]
, ...)la source
$a =
expansion ci-dessus??
.$a ?? 'fallback'
ne définit ni ne modifie la valeur de $ a. (Il renvoie simplement une valeur).Il semble qu'il y ait des avantages et des inconvénients à utiliser l'un
??
ou l' autre?:
. Le pro de l 'utilisation?:
est qu'il évalue faux et nul et "" pareil. L'inconvénient est qu'il signale un E_NOTICE si l'argument précédent est nul. Avec??
le pro c'est qu'il n'y a pas d'E_NOTICE, mais le con c'est qu'il n'évalue pas faux et nul pareil. D'après mon expérience, j'ai vu des gens commencer à utiliser null et false de manière interchangeable, mais ils ont finalement recours à la modification de leur code pour être cohérent avec l'utilisation de null ou false, mais pas les deux. Une alternative est de créer une condition ternaire plus élaborée:(isset($something) or !$something) ? $something : $something_else
.Voici un exemple de la différence d'utilisation de l'
??
opérateur en utilisant à la fois null et false:Cependant, en développant l'opérateur ternaire, nous pouvons faire en sorte qu'une chaîne "" vide ou fausse se comporte comme si elle était nulle sans lancer un e_notice:
Personnellement, je pense que ce serait vraiment bien si une future version de PHP incluait un autre nouvel opérateur:
:?
qui remplacerait la syntaxe ci-dessus. ie:// $var = $false :? "true";
Cette syntaxe évaluerait null, false et "" également et ne lancerait pas E_NOTICE ...la source
?? null ?:
chose est assez génial, merci mr. gars intelligent.la source
Null Coalescing operator
effectue seulement deux tâches: il vérifiewhether the variable is set
etwhether it is null
. Jetez un œil à l'exemple suivant:L'exemple de code ci-dessus indique que
Null Coalescing operator
traite une variable non existante et une variable qui est définie surNULL
de la même manière.Null Coalescing operator
est une amélioration par rapport à laternary operator
. Jetez un œil à l'extrait de code suivant comparant les deux:Ainsi, la différence entre les deux est que l'
Null Coalescing operator
opérateur est conçu pour gérer les variables non définies mieux que leternary operator
. Alors que,ternary operator
c'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
la source
isset($_POST['fullname'])
vérifie déjà lesNULL
valeurs - donc le&& !is_null($_POST['fullname'])
premier exemple est de toute façon redondantLorsque vous utilisez les superglobaux comme $ _GET ou $ _REQUEST, vous devez savoir qu'ils peuvent être une chaîne vide. Dans ce cas particulier, cet exemple
échouera car la valeur de $ username est maintenant une chaîne vide.
Ainsi, lorsque vous utilisez $ _GET ou même $ _REQUEST, vous devez utiliser l'opérateur ternaire à la place comme ceci:
Maintenant, la valeur de $ username est «personne» comme prévu.
la source