Kann jemand die Unterschiede zwischen erklären Abkürzung für ternäre Operatoren (?:
) Und Null-Koaleszenzoperator (??
) in PHP?
Wann verhalten sie sich anders und wann gleich (falls das überhaupt vorkommt)?
$a ?: $b
VS.
$a ?? $b
ballern
Kann jemand die Unterschiede zwischen erklären Abkürzung für ternäre Operatoren (?:
) Und Null-Koaleszenzoperator (??
) in PHP?
Wann verhalten sie sich anders und wann gleich (falls das überhaupt vorkommt)?
$a ?: $b
VS.
$a ?? $b
MeisterOdin
Wenn Ihr erstes Argument null ist, sind sie im Grunde gleich, außer dass die Null-Koaleszenz kein ausgibt E_NOTICE
wenn Sie eine undefinierte Variable haben. Der PHP 7.0-Migrationsdokumentation hat dies zu sagen:
Der Null-Coalescing-Operator (??) wurde als syntaktischer Zucker für den häufigen Fall hinzugefügt, dass ein Ternär in Verbindung mit isset() verwendet werden muss. Es gibt seinen ersten Operanden zurück, falls er existiert und nicht NULL ist; andernfalls gibt es seinen zweiten Operanden zurück.
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 verkürzten ternären Operator anstelle des Null-Koaleszenzoperators verwende. Aber selbst mit der Benachrichtigung gibt PHP die gleiche Antwort zurück.
Führen Sie den Code aus: https://3v4l.org/McavC
Dies setzt natürlich immer voraus, dass das erste Argument ist null
. Sobald es nicht mehr null ist, ergeben sich Unterschiede darin, dass die ??
-Operator würde immer das erste Argument zurückgeben, während der ?:
Kurzschrift würde nur, wenn das erste Argument wahr wäre, und das hängt davon ab, wie PHP würde Dinge in einen booleschen Wert umwandeln.
So:
$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'
hätte dann $a
gleich sein false
Und $b
gleich 'g'
.
Tipp: Wenn Sie ?? statt ?: aber dann müssen Sie Ihren Code mit älteren PHP-Versionen als 7 kompatibel machen (für ein Plugin zum Beispiel), dann möchten Sie vielleicht das ?? mit isset($etwas) ? $something : $something_else überall in Ihrem Code. Sie können dies ganz einfach mit Notepad++ oder nedit (und auch anderen Editoren) tun, indem Sie das Werkzeug zum Suchen/Ersetzen verwenden, die Option für reguläre Ausdrücke auswählen und in das Suchfeld einfügen: “\s*(\S+)\s*\?\?” und im Ersetzungsfeld: ” isset($1) ? $1 :” ohne die Anführungszeichen (nedit verwendet \1 anstelle von $1). Dann alle ersetzen.
– Damian Grün
8. Juli 2017 um 23:51 Uhr
Dies ist die richtige Antwort, aber die Wahrheitsprüfung ist der Hauptunterschied und sollte stärker betont werden.
– mancze
1. August 2017 um 12:37 Uhr
@MasterOdin Nicht zufrieden mit Ihrer Antwort. Beide sind nicht gleich. Habe ein anderes Ergebnis.
– Dhairya Lakhera
18. November 2017 um 8:10 Uhr
Es ist erwähnenswert, dass Sie ?? mit Verkettung. Zum Beispiel: $b = []; var_dump($b['a']['b']['c'] ?? 'default');
oder mit Gegenständen $b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
– Jack B
6. November 2019 um 14:59 Uhr
Bitte beachten Sie, dass das Verhalten auch bei unterschiedlich ist $a = [];
. Sehen: 3v4l.org/iCCa0
– Soullivaneuh
4. Mai 2020 um 14:36 Uhr
a20
Führen Sie das Folgende im interaktiven PHP-Modus aus (php -a
am Endgerät). Der Kommentar zu jeder Zeile zeigt das Ergebnis.
var_export (false ?? 'value2'); // false
var_export (true ?? 'value2'); // true
var_export (null ?? 'value2'); // value2
var_export ('' ?? 'value2'); // ""
var_export (0 ?? 'value2'); // 0
var_export (false ?: 'value2'); // value2
var_export (true ?: 'value2'); // true
var_export (null ?: 'value2'); // value2
var_export ('' ?: 'value2'); // value2
var_export (0 ?: 'value2'); // value2
??
??
ist wie ein “Tor”, das nur NULL durchlässt.NULL
.??
ist gleich wie ( !isset() || is_null() )
??
!isset() || is_null()
überprüfen$object = $object ?? new objClassName();
$v = $x ?? $y ?? $z;
// This is a sequence of "SET && NOT NULL"s:
if( $x && !is_null($x) ){
return $x;
} else if( $y && !is_null($y) ){
return $y;
} else {
return $z;
}
?:
?:
ist wie ein Tor, das zulässt anything falsy
durch – einschließlich NULL
0
, empty string
, NULL
, false
, !isset()
, empty()
X ? Y : Z
?:
wird werfen PHP NOTICE
auf undefiniert (unset
oder !isset()
) Variablen?:
empty()
, !isset()
, is_null()
usw!empty($x) ? $x : $y
Zu $x ?: $y
if(!$x) { echo $x; } else { echo $y; }
Zu echo $x ?: $y
echo 0 ?: 1 ?: 2 ?: 3; //1
echo 1 ?: 0 ?: 3 ?: 2; //1
echo 2 ?: 1 ?: 0 ?: 3; //2
echo 3 ?: 2 ?: 1 ?: 0; //3
echo 0 ?: 1 ?: 2 ?: 3; //1
echo 0 ?: 0 ?: 2 ?: 3; //2
echo 0 ?: 0 ?: 0 ?: 3; //3
// Source & Credit: http://php.net/manual/en/language.operators.comparison.php#95997
// This is basically a sequence of:
if( truthy ) {}
else if(truthy ) {}
else if(truthy ) {}
..
else {}
if( isset($_GET['name']) && !is_null($_GET['name'])) {
$name = $_GET['name'];
} else if( !empty($user_name) ) {
$name = $user_name;
} else {
$name="anonymous";
}
$name = $_GET['name'] ?? $user_name ?: 'anonymous';
Überlegen, bis auf einen Fehler: Kürzen if(!$x) { echo $x; } else { echo $y; }
Zu echo $x ?: $y
. Das eine ist dem anderen nicht gleich. Der Zustand muss sein if($x)
stattdessen ohne Verneinung. Es hat mich immer noch ein wenig über diesen Operator lernen lassen, der in seiner Kurzversion neu für mich war, also erhielt der Beitrag eine positive Bewertung.
– Seelenräuber
25. November 2020 um 12:13 Uhr
In php bitte immer verwenden elseif
als ein einzelnes Wort, um es an den PSR-12-Codierungsstandards auszurichten. Ich weiß, dass Sie nur eine Demonstration gemacht haben, aber isset($_GET['name']) && !is_null($_GET['name'])
An erster Stelle steht die redundante Prüfung.
– mickmackusa
25. Dezember 2020 um 7:40 Uhr
Dies ist eine sehr gute Antwort, um zu erfahren, wie diese Operatoren funktionieren, aber ich hoffe, ich muss nie Probleme mit Produktionscode beheben, der beide Operatoren in einer Anweisung verwendet!
– Liam
12. Mai 2021 um 19:18 Uhr
Andreas
Wenn Sie den ternären Shortcut-Operator so verwenden, wird eine Benachrichtigung angezeigt, wenn $_GET['username']
ist nicht eingestellt:
$val = $_GET['username'] ?: 'default';
Also musst du stattdessen so etwas tun:
$val = isset($_GET['username']) ? $_GET['username'] : 'default';
Der Null-Koaleszenzoperator entspricht der obigen Anweisung und gibt ‘default’ zurück, wenn $_GET['username']
nicht gesetzt ist oder ist null
:
$val = $_GET['username'] ?? 'default';
Beachten Sie, dass es überprüft nicht die Wahrhaftigkeit. Es prüft nur, ob es gesetzt und nicht null ist.
Sie können dies auch tun, und das erste definiert (einstellen und nicht null
) Wert wird zurückgegeben:
$val = $input1 ?? $input2 ?? $input3 ?? 'default';
Nun, das ist ein richtiger Koaleszenzoperator.
Um keinen Hinweis erzeugen zu lassen, sollte man verwenden $var = empty($other_var) ? 'default_value' : $other_var;
. Beachten Sie, dass dies ausschließt ''
, null
, false
Und 0
– St3an
9. Juli 2021 um 13:50 Uhr
Dhairya Lakhera
Der Hauptunterschied ist das
Ternärer Operator Ausdruck expr1 ?: expr3
kehrt zurück expr1
Wenn expr1
wertet zu
TRUE
andererseits Null-Koaleszenz-Operator Ausdruck (expr1) ?? (expr2)
wertet zu expr1
Wenn expr1
Ist nicht NULL
Ternärer Operator expr1 ?: expr3
eine Benachrichtigung ausgeben, wenn der Wert auf der linken Seite (expr1)
existiert nicht, aber auf der anderen Seite Null-Koaleszenz-Operator (expr1) ?? (expr2)
Insbesondere wird kein Hinweis ausgegeben, wenn die linke Seite einen Wert hat (expr1)
existiert nicht, genau wie isset()
.
TernärOperator ist linksassoziativ
((true ? 'true' : false) ? 't' : 'f');
Null-Koaleszenz-Operator ist rechtsassoziativ
($a ?? ($b ?? $c));
Lassen Sie uns nun den Unterschied zwischen anhand eines Beispiels erklären:
Ternärer Operator (?:)
$x='';
$value=($x)?:'default';
var_dump($value);
// The above is identical to this if/else statement
if($x){
$value=$x;
}
else{
$value="default";
}
var_dump($value);
Null-Koaleszenz-Operator (??)
$value=($x)??'default';
var_dump($value);
// The above is identical to this if/else statement
if(isset($x)){
$value=$x;
}
else{
$value="default";
}
var_dump($value);
Hier ist die Tabelle, die den Unterschied und die Ähnlichkeit zwischen erklärt '??'
Und ?:
Besonderer Hinweis: Der Null-Koaleszenz-Operator und der ternäre Operator sind ein Ausdruck und werden nicht als Variable ausgewertet, sondern als Ergebnis eines Ausdrucks. Dies ist wichtig zu wissen, wenn Sie eine Variable als Referenz zurückgeben möchten. Die Anweisung gibt $foo ?? $bar; und $var == 42 zurückgeben? $a : $b; in einer Return-by-Reference-Funktion funktioniert daher nicht und es wird eine Warnung ausgegeben.
Chazy Chaz
Beide verhalten sich unterschiedlich, wenn es um das dynamische Datenhandling geht.
Wenn die Variable leer ist ( ” ), behandelt die Null-Koaleszenz die Variable als wahr, der ternäre Kurzoperator jedoch nicht. Und das ist etwas zu bedenken.
$a = NULL;
$c="";
print $a ?? '1b';
print "\n";
print $a ?: '2b';
print "\n";
print $c ?? '1d';
print "\n";
print $c ?: '2d';
print "\n";
print $e ?? '1f';
print "\n";
print $e ?: '2f';
Und die Ausgabe:
1b
2b
2d
1f
Notice: Undefined variable: e in /in/ZBAa1 on line 21
2f
Verknüpfung: https://3v4l.org/ZBAa1
Dies ist eindeutig kontraintuitiv für PHP, wo ein leerer String normalerweise als falsch angesehen wird. In den Dokumenten ist es jedoch eindeutig für ?? angegeben: It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
.
– Simon
17. Oktober 2019 um 13:06 Uhr
Hass
Beide sind Abkürzungen für längere Ausdrücke.
?:
Kurzform für $a ? $a : $b
. Dieser Ausdruck wird zu $a ausgewertet, wenn $a zu ausgewertet wird WAHR.
??
Kurzform für isset($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 ??
erzeugt keine E_NOTICE, aber die Ergebnisse sind die gleichen. Wenn $a null ist, ist das Ergebnis dasselbe.
Dies ist eindeutig kontraintuitiv für PHP, wo ein leerer String normalerweise als falsch angesehen wird. In den Dokumenten ist es jedoch eindeutig für ?? angegeben: It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
.
– Simon
17. Oktober 2019 um 13:06 Uhr
Für die Anfänger:
Null-Koaleszenzoperator (??)
Alles ist wahr, außer null
Werte und undefiniert (Variable/Array-Index/Objektattribute)
ex:
$array = [];
$object = new stdClass();
var_export (false ?? 'second'); # false
var_export (true ?? 'second'); # true
var_export (null ?? 'second'); # 'second'
var_export ('' ?? 'second'); # ""
var_export ('some text' ?? 'second'); # "some text"
var_export (0 ?? 'second'); # 0
var_export ($undefinedVarible ?? 'second'); # "second"
var_export ($array['undefined_index'] ?? 'second'); # "second"
var_export ($object->undefinedAttribute ?? 'second'); # "second"
Dies ist im Grunde genommen die Überprüfung, ob die Variable (Array-Index, Objektattribut usw.) vorhanden ist und nicht null
. ähnlich zu isset
Funktion
Ternäre Operatoren-Kurzform (?:)
alle falschen Dinge (false
,null
,0
,leerer String) kommen als falsch, aber wenn es ein undefinierter ist, kommt es auch als falsch aber Notice
wird werfen
ex
$array = [];
$object = new stdClass();
var_export (false ?: 'second'); # "second"
var_export (true ?: 'second'); # true
var_export (null ?: 'second'); # "second"
var_export ('' ?: 'second'); # "second"
var_export ('some text' ?? 'second'); # "some text"
var_export (0 ?: 'second'); # "second"
var_export ($undefinedVarible ?: 'second'); # "second" Notice: Undefined variable: ..
var_export ($array['undefined_index'] ?: 'second'); # "second" Notice: Undefined index: ..
var_export ($object->undefinedAttribute ?: 'second'); # "Notice: Undefined index: ..
Hoffe das hilft
Eine gute Möglichkeit zum Testen ist die Verwendung einer PHP-Konsole im interaktiven Modus (
php -a
). Dannini_set('error_reporting', 'E_ALL')
Undini_set('display_errors', 'on')
. Dann kannst du es versuchenvar_dump($var ?? 'default'))
zB und sehen Sie, was passiert, ob Sie irgendeine Art von Werten davor setzen– St3an
9. Juli 2021 um 13:55 Uhr
Per Google nicht leicht zu finden: Dokumentation: Es ist möglich, den mittleren Teil des ternären Operators wegzulassen. Ausdruck
expr1 ?: expr3
kehrt zurückexpr1
Wennexpr1
wertet zutrue
Undexpr3
ansonsten.– Basj
1. Dezember 2021 um 14:07 Uhr