Gibt es optionale Verkettung in PHP? [duplicate]

Lesezeit: 3 Minuten

Ich möchte Prüfungen auf Null in verketteten Anweisungen wie weglassen

if($a && $a->$b && $a->$b->$c){
  $d = $a->$b->$c;
}

und verwenden Sie stattdessen optionale Verkettung.

Ist dies möglich oder in PHP implementiert?

  • Nein, das ist nicht implementiert.

    – misorude

    6. September 2019 um 8:55 Uhr

Nicht vor PHP 8.0.

Darüber wurde abgestimmt und verabschiedet Nullsafe-Operator RFC.

Die Syntax wird sein ?->.

Also die Aussage:

if ($a && $a->$b && $a->$b->$c) {
  $d = $a->$b->$c;
}

Könnte umgeschrieben werden zu:

$d = $a?->$b?->$c;  // If you are happy to assign null to $d upon failure

Oder:

if ($a?->$b?->$c) {
  $d = $a->$b->$c; // If you want to keep it exactly per the previous statement
}

Der Nullsafe-Operator funktioniert sowohl für Eigenschaften als auch für Methoden.

  • Von Swift kommend, habe ich sofort ?-> getippt und dachte, es würde funktionieren, aber bevor ich es ausprobiert habe, habe ich das nachgeschlagen und bin hier gelandet!

    – om-ha

    28. Februar 2021 um 23:37 Uhr

Foued MOUSSIs Benutzeravatar
Foued MOUSSI

Demzufolge Artikel
“Der Null-Coalescing-Operator (eingeführt in PHP 7) wird so dargestellt ?? wird verwendet, um zu prüfen, ob der Wert gesetzt oder null ist, oder mit anderen Worten, wenn der Wert existiert und nicht null ist, dann gibt es den ersten Operanden zurück, andernfalls gibt es den zweiten Operanden zurück.”

Kannst du also problemlos machen

$d = $a->$b->$c ?? 'DEFAULT' ; 

BEARBEITEN: Dies funktioniert nur für Eigenschaften, nicht für Methoden (wie von “hackel” in den Kommentaren unten angegeben)

  • Wusste nicht, dass dies auch für Verkettungen funktioniert. Beste Lösung.

    – Michael

    23. Januar 2020 um 14:58 Uhr

  • Haben Sie diese Informationen selbst überprüft? es scheint, dass es überhaupt nicht funktioniert class Something { public function getSomething() { return null; } } $something = new Something(); var_dump($something->getSomething()->getSomethingElse() ?? 'default'); produziert <b>Fatal error</b>: Uncaught Error: Call to a member function getSomethingElse() on null

    – Oliboy50

    23. April 2020 um 8:32 Uhr


  • Laut den Dokumenten ist der Null-Koaleszenz-Operator nur syntantischer Zucker: exprA ?? exprB ist äquivalent zu isset(exprA) ? exprA : exprB. isset unterstützt so etwas wie optionales Verketten, aber nur für Arrays. $empty = []; isset($empty['a']['b']); // false, no exception

    – Kevin Peña

    4. Mai 2020 um 15:28 Uhr

  • @Oliboy50 Es funktioniert nur für Eigenschaften, nicht für Methoden. z.B $a = new class () { public $b; }; $d = $a->b->c ?? 'DEFAULT';

    – Hackel

    29. Mai 2020 um 1:04 Uhr


  • Danke @hackel, ich habe meine Ablehnung dann bearbeitet und entfernt 🙂

    – Oliboy50

    30. Mai 2020 um 9:48 Uhr

Benutzeravatar von Nick
Nick

In PHP-Versionen kleiner als 8 wird optionale Verkettung nicht unterstützt. Sie können es nachahmen für Eigenschaften durch die Verwendung der Fehlerkontrolloperator (@), wodurch alle Fehler unterdrückt werden, die normalerweise bei der Zuweisung auftreten würden. Zum Beispiel:

$b = 'b';
$c="c";
$e="e";
$a = (object)['b' => (object)['e' => 2]];
@$d = $a->$b->$c;
var_dump($d);
@$d = $a->$b->$e;
var_dump($d);

Ausgang:

NULL
int(2)

Demo auf 3v4l.org

Eine bessere Lösung ist die Verwendung des Null-Coalescing-Operators, wie in der @FouedMOUSSI-Antwort beschrieben.

Ab PHP8 (veröffentlicht am 26.11.2020) wird optionales Verketten über die unterstützt nullsafe-Operator (siehe Antwort von @Paul oder das gepostete Duplikat).

Wie von @Paul erwähnt, ist nullsafe in PHP 8 verfügbar. Nachdem ich diese Frage heute gelesen hatte, stellte ich gerade fest, dass PHP 8 gestern (26.11.2020) mit verfügbaren nullsafe-Operatoren veröffentlicht wurde 🙂

Also ja, es ist jetzt in PHP verfügbar und ich kann es kaum erwarten, es zu verwenden.

https://www.php.net/releases/8.0/en.php

1444390cookie-checkGibt es optionale Verkettung in PHP? [duplicate]

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

Privacy policy