Wenn Ihr erstes Argument null ist, sind sie im Grunde gleich, außer dass die Null-Koaleszenz keine ausgibt, E_NOTICE
wenn Sie eine undefinierte Variable haben. In den PHP 7.0-Migrationsdokumenten heißt es:
Der Null-Koaleszenz-Operator (??) wurde als syntaktischer Zucker für den allgemeinen Fall hinzugefügt, dass in Verbindung mit isset () ein Ternär verwendet werden muss. Es gibt seinen ersten Operanden zurück, wenn er existiert und nicht NULL ist. Andernfalls wird der zweite Operand zurückgegeben.
Hier ist ein Beispielcode, um dies zu demonstrieren:
<?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";
Die Zeilen mit dem Hinweis sind diejenigen, in denen ich den ternären Kurzoperator im Gegensatz zum Null-Koaleszenzoperator verwende. Trotz des Hinweises gibt PHP die gleiche Antwort zurück.
Führen Sie den Code aus: https://3v4l.org/McavC
Dies setzt natürlich immer das erste Argument voraus null
. Sobald es nicht mehr null ist, gibt es Unterschiede darin, dass der ??
Operator immer ?:
das erste Argument zurückgibt, während die Kurzform nur dann, wenn das erste Argument wahr ist, und dies davon abhängt, wie PHP Dinge in einen Booleschen Wert umwandelt .
Damit:
$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'
wäre dann $a
gleich false
und $b
gleich 'g'
.
$b = []; var_dump($b['a']['b']['c'] ?? 'default');
oder mit Objekten$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
$a = [];
. Siehe: 3v4l.org/iCCa0Lief das unten im PHP Interactive Mode (
php -a
am Terminal). Der Kommentar in jeder Zeile zeigt das Ergebnis.Das ist also meine Interpretation:
1. Der Null-Koaleszenz-Operator -
??
:??
ist wie ein "Tor", das nur NULL durchlässt .NULL
.??
dasselbe wie( !isset() || is_null() )
2. Der ternäre Operator -
?:
?:
ist wie ein Tor, das durchlässtanything falsy
- einschließlichNULL
0
,empty string
,NULL
,false
,!isset()
,empty()
.. alles , was riecht falsyecho ($x ? $x : false)
?:
WirftPHP NOTICE
undefinierte (unset
oder!isset()
) Variablen auf3. Also Doktor, wann benutze ich
??
und?:
..?:
wann verwendenempty($x)
Kontrollen!empty($x) ? $x : $y
kann auf verkürzt werden$x ?: $y
if(!$x) { fn($x); } else { fn($y); }
kann auf verkürzt werdenfn(($x ?: $y))
??
wann verwenden!isset() || is_null()
Scheck machen$object = $object ?? new objClassName();
4. Stapeloperatoren ...
Ternärer Operator kann gestapelt werden ...
Quelle & Gutschrift für diesen Code
Dies ist im Grunde eine Folge von:
Null Coalese Operator kann gestapelt werden ...
Dies ist eine Folge von:
Mit Stacking kann ich Folgendes verkürzen:
Dazu:
Cool, oder? :-)
quelle
Wenn Sie den ternären Verknüpfungsoperator wie folgt verwenden, wird ein Hinweis ausgegeben, wenn er
$_GET['username']
nicht festgelegt ist:Also müssen Sie stattdessen so etwas tun:
Der Null-Koaleszenz-Operator entspricht der obigen Anweisung und gibt 'default' zurück, wenn er
$_GET['username']
nicht gesetzt ist oder istnull
:Beachten Sie, dass die Wahrhaftigkeit nicht überprüft wird . Es wird nur geprüft, ob es gesetzt und nicht null ist.
Sie können dies auch tun, und der erste definierte (festgelegte und nicht festgelegte
null
) Wert wird zurückgegeben:Das ist ein richtiger Koaleszenzoperator.
quelle
Der Hauptunterschied ist das
Ternary Operator Ausdruck
expr1 ?: expr3
kehrt ,expr1
wennexpr1
auswertet , umTRUE
aber auf der anderen Seite Null Coalescing Operator Ausdruck(expr1) ?? (expr2)
auswertet auf ,expr1
wennexpr1
ist nichtNULL
Der ternäre Operator gibt
expr1 ?: expr3
eine Benachrichtigung aus, wenn der Wert auf der linken Seite(expr1)
nicht vorhanden ist, andererseits jedoch der Null-Koaleszenz-Operator. Gibt(expr1) ?? (expr2)
insbesondere keine Benachrichtigung aus, wenn der Wert auf der linken Seite(expr1)
nicht vorhanden istisset()
.TernaryOperator bleibt assoziativ
Null Coalescing Operator ist richtig assoziativ
Lassen Sie uns nun den Unterschied anhand eines Beispiels erklären:
Ternärer Operator
(?:)
Null-Koaleszenz-Operator
(??)
Hier ist die Tabelle, die den Unterschied und die Ähnlichkeit zwischen
'??'
und erklärt?:
quelle
Beide verhalten sich beim dynamischen Datenhandling unterschiedlich.
Wenn die Variable leer ist (''), behandelt die Null-Koaleszenz die Variable als wahr, der ternäre Kurzoperator jedoch nicht. Und das ist etwas zu beachten.
Und die Ausgabe:
Link: https://3v4l.org/ZBAa1
quelle
It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
.Beide sind Abkürzungen für längere Ausdrücke.
?:
ist die Abkürzung für$a ? $a : $b
. Dieser Ausdruck wird zu $ a ausgewertet, wenn $ a zu TRUE ausgewertet wird .??
ist die Abkürzung fürisset($a) ? $a : $b
. Dieser Ausdruck wird zu $ a ausgewertet, wenn $ a gesetzt und nicht null ist.Ihre Anwendungsfälle überschneiden sich, wenn $ a undefiniert oder null ist. Wenn $ a undefiniert ist,
??
wird kein E_NOTICE erzeugt, aber die Ergebnisse sind dieselben. Wenn $ a null ist, ist das Ergebnis dasselbe.quelle
Für die Anfänger:
Null-Koaleszenz-Operator (??)
Alles ist wahr, außer
null
Werte und undefiniert (Variablen- / Array-Index- / Objektattribute).Ex:
Dies ist im Grunde genommen eine Überprüfung, ob die Variable (Array-Index, Objektattribut usw.) vorhanden ist und nicht
null
. ähnlich derisset
FunktionKurzform des ternären Operators (? :)
alle falschen Dinge (
false
,null
,0
, leere Zeichenkette) als falsch kommen, aber wenn es eine ist nicht definiert es kommt auch als falsch , sondernNotice
werden werfenEx
Hoffe das hilft
quelle
Scrollen Sie auf diesem Link nach unten und sehen Sie sich den Abschnitt an. Dort sehen Sie ein Vergleichsbeispiel wie folgt:
Es wird jedoch nicht empfohlen, die Operatoren zu verketten, da dies das Verständnis des Codes beim späteren Lesen erschwert.
Wenn Sie den Koaleszenzoperator verwenden, wird er im Gegensatz zum ternären Operator automatisch auf Null überprüft.
quelle
a || b || c
Muster in JS sehr ähnlich , außer dass PHPs für Boolesche Werte verwendet werden können (false || 2
in JS ist 2;false ?? 2
in PHP ist falsch)Die anderen Antworten gehen tief und geben großartige Erklärungen. Für diejenigen, die nach einer schnellen Antwort suchen,
$a ?: 'fallback'
ist$a ? $a : 'fallback'
während
$a ?? 'fallback'
ist$a = isset($a) ? $a : 'fallback'
Der Hauptunterschied wäre, wenn der linke Operator entweder:
0
,''
,false
,[]
, ...)quelle
$a =
in der obigen Erweiterung von geben??
.$a ?? 'fallback'
setzt oder ändert den Wert von $ a nicht. (Es wird lediglich ein Wert zurückgegeben).Es scheint, dass es Vor- und Nachteile gibt, entweder
??
oder zu verwenden?:
. Der Vorteil bei der Verwendung?:
ist, dass es false und null und "" gleich auswertet. Der Nachteil ist, dass ein E_NOTICE gemeldet wird, wenn das vorhergehende Argument null ist. Mit??
dem Pro ist, dass es kein E_NOTICE gibt, aber der Nachteil ist, dass es nicht falsch und null gleich bewertet. Nach meiner Erfahrung haben die Leute angefangen, null und false austauschbar zu verwenden, aber dann haben sie schließlich versucht, ihren Code so zu ändern, dass er entweder null oder false verwendet, aber nicht beide. Eine Alternative besteht darin, eine ausgefeiltere ternäre Bedingung zu schaffen :(isset($something) or !$something) ? $something : $something_else
.Das Folgende ist ein Beispiel für den Unterschied bei der Verwendung des
??
Operators mit null und false:Indem wir jedoch auf den ternären Operator eingehen, können wir dafür sorgen, dass sich eine falsche oder leere Zeichenfolge "" so verhält, als wäre sie eine Null, ohne eine e_notice auszulösen:
Persönlich denke ich, dass es wirklich schön wäre, wenn eine zukünftige Version von PHP einen weiteren neuen Operator enthalten würde:
:?
der die obige Syntax ersetzt. dh:// $var = $false :? "true";
Diese Syntax würde null, false und "" gleichermaßen auswerten und kein E_NOTICE auslösen ...quelle
?? null ?:
Sache ist ziemlich genial, danke mr. schlauer Typ.quelle
Null Coalescing operator
führt nur zwei Aufgaben aus: es prüftwhether the variable is set
undwhether it is null
. Schauen Sie sich das folgende Beispiel an:Das obige Codebeispiel besagt, dass
Null Coalescing operator
eine nicht vorhandene Variable und eine Variable, auf die gesetzt ist, aufNULL
dieselbe Weise behandelt werden.Null Coalescing operator
ist eine Verbesserung gegenüber demternary operator
. Schauen Sie sich das folgende Code-Snippet an, in dem die beiden verglichen werden:Der Unterschied zwischen beiden besteht also darin, dass der
Null Coalescing operator
Operator dafür ausgelegt ist, undefinierte Variablen besser zu verarbeiten als derternary operator
. Während dasternary operator
eine Abkürzung für istif-else
.Null Coalescing operator
ist nicht als Ersatz gedachtternary operator
, aber in einigen Anwendungsfällen wie im obigen Beispiel können Sie sauberen Code mit weniger Aufwand schreiben.Credits: http://dwellupper.io/post/6/php7-null-coalescing-operator-usage-and-examples
quelle
isset($_POST['fullname'])
prüft bereits aufNULL
Werte - daher ist das&& !is_null($_POST['fullname'])
im ersten Beispiel sowieso überflüssigWenn Sie Superglobale wie $ _GET oder $ _REQUEST verwenden, sollten Sie sich bewusst sein, dass es sich um eine leere Zeichenfolge handeln kann. In diesem speziellen Fall dieses Beispiel
schlägt fehl, da der Wert von $ username jetzt eine leere Zeichenfolge ist.
Wenn Sie also $ _GET oder sogar $ _REQUEST verwenden, sollten Sie stattdessen den ternären Operator wie folgt verwenden:
Jetzt ist der Wert von $ username wie erwartet 'niemand'.
quelle