PHP Elvis-Operator vs. Null-Coalescing-Operator

Lesezeit: 10 Minuten

Benutzer-Avatar
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

  • Eine gute Möglichkeit zum Testen ist die Verwendung einer PHP-Konsole im interaktiven Modus (php -a). Dann ini_set('error_reporting', 'E_ALL')und ini_set('display_errors', 'on'). Dann kannst du es versuchen var_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ück expr1 Wenn expr1 wertet zu trueund expr3 ansonsten.

    – Basj

    1. Dezember 2021 um 14:07 Uhr


Benutzer-Avatar
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. Das 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 gleicht '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.

    – Neugierig

    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

Benutzer-Avatar
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

Der Null-Coalescing-Operator ??

  • ?? ist wie ein “Tor”, das nur NULL durchlässt.
  • So, es gibt immer den ersten Parameter zurückwenn nicht Der erste Parameter ist zufällig NULL.
  • Das heisst ?? ist gleich wie ( !isset() || is_null() )

Gebrauch von ??

  • verkürzen !isset() || is_null() überprüfen
  • z.B $object = $object ?? new objClassName();

Stapeln des Null-Coalese-Operators

        $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; 
        }

Der ternäre Operator ?:

  • ?: ist wie ein Tor, das zulässt anything falsy durch – einschließlich NULL
  • Alles falsch: 0, empty string, NULL, false, !isset(), empty()
  • Dasselbe wie beim alten ternären Operator: X ? Y : Z
  • Notiz: ?: wird werfen PHP NOTICE auf undefiniert (unset oder !isset()) Variablen

Gebrauch von ?:

  • Überprüfung empty(), !isset(), is_null() etc
  • ternäre Operation wie verkürzen !empty($x) ? $x : $y zu $x ?: $y
  • verkürzen if(!$x) { echo $x; } else { echo $y; } zu echo $x ?: $y

Ternärer Stapeloperator

        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 {}

Wenn wir beide stapeln, können wir dies verkürzen:

        if( isset($_GET['name']) && !is_null($_GET['name'])) {
            $name = $_GET['name'];
        } else if( !empty($user_name) ) {
             $name = $user_name; 
        } else {
            $name="anonymous";
        }

Dazu:

        $name = $_GET['name'] ?? $user_name ?: 'anonymous';

Cool, oder? 🙂

  • Ü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

Benutzer-Avatar
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';

Das 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, falseund 0

    – St3an

    9. Juli 2021 um 13:50 Uhr

Benutzer-Avatar
Dhairya Lakhera

Der Hauptunterschied ist das

  1. 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

  2. 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().

  3. 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 ?:

Geben Sie hier die Bildbeschreibung ein

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.

Benutzer-Avatar
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


Benutzer-Avatar
Hass

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 ausgewertet wird WAHR.

?? ist die Abkürzung 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

1012180cookie-checkPHP Elvis-Operator vs. Null-Coalescing-Operator

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy