?? liefert den Wert links davon, wenn er existiert und nicht null ist, sonst den Wert rechts davon: $name = $_GET['name'] ?? 'Guest';. Anders als beim direkten Lesen des Schlüssels gibt es nie eine Warnung, wenn die Variable oder der Array-Schlüssel fehlt.
Beim ersten Durchlauf gibt es keinen Query-String, also werden beide Standardwerte verwendet. Klicke im Tab Page auf einen Link, und das Skript läuft erneut mit gefülltem $_GET. $_GET["name"] ohne ?? zu lesen, würde bei diesem ersten Durchlauf in einer normalen PHP-Umgebung Warning: Undefined array key "name" ausgeben. Mehr über Request-Daten steht auf der Seite zu _POST.
?? ist eine kurze isset()-Prüfung
$a ?? $b bedeutet genau isset($a) ? $a : $b. Es funktioniert mit Variablen, Array-Schlüsseln in beliebiger Tiefe und Objekteigenschaften und hält beim ersten fehlenden Teil an, ohne sich zu beschweren.
Die Prüfung ist dieselbe, die isset macht, also bekommt auch ein Schlüssel, der mit dem Wert null existiert, den Standardwert.
?? verketten, um mehrere Quellen zu probieren
?? ist rechtsassoziativ, und du kannst beliebig viele verketten. PHP liefert den ersten Operanden, der gesetzt und nicht null ist.
??= weist nur bei null zu
$a ??= $b speichert $b in $a nur, wenn $a nicht gesetzt oder null ist. Das ist der kürzeste Weg, Standardwerte einzutragen oder etwas einmal zu berechnen und danach wiederzuverwenden.
Die rechte Seite von ??= wird nur ausgewertet, wenn die Zuweisung stattfindet, und deshalb erscheint computing 4 nur einmal.
?? vs ?: (kurzer Ternär-Operator)
?? prüft auf null. ?: prüft auf Truthiness. Bei Werten wie 0, "" und "0" liefern sie unterschiedliche Antworten:
Eine Menge von "0" ist eine echte Eingabe: ?? behält sie, ?: ersetzt sie. ?: allein würde vor dem fehlenden Schlüssel warnen, deshalb schreibt der Block ($inputs[$key] ?? null) ?: .... Die Seite zum ternären Operator behandelt ?: selbst.
Der Nullsafe-Operator ?->
?-> ist die Objektversion derselben Idee und kam mit PHP 8. Ist das Objekt links null, stoppt die ganze Kette und liefert null, statt einen Error wie Call to a member function getAddress() on null zu werfen. Setze ein ?? ans Ende für einen Standardwert.
Nutzer 2 existiert, hat aber keine Adresse, und Nutzer 3 existiert gar nicht. Beide landen ohne Fehler beim Standardwert ?? "unknown".
Typischer Fehler: ?? hat eine niedrige Rangfolge
?? bindet schwächer als . und die arithmetischen Operatoren. In "Count: " . $count ?? 0 baut PHP also zuerst den String "Count: " . $count, der nie null ist, und der Standardwert wird nie verwendet.
Setze den Ausdruck mit ?? in Klammern, sobald er Teil eines größeren Ausdrucks ist.
Häufig gestellte Fragen
Was bedeutet ?? in PHP?
?? ist der Null-Coalescing-Operator. $a ?? $b liefert $a, wenn es existiert und nicht null ist, sonst $b. Es ist die Kurzform von isset($a) ? $a : $b und gibt keine Warnung aus, wenn $a oder ein Array-Schlüssel undefiniert ist.
Was ist der Unterschied zwischen ?? und ?: in PHP?
?? fällt nur zurück, wenn die linke Seite null oder nicht gesetzt ist, also ist 0 ?? 5 gleich 0 und '' ?? 'x' gleich ''. ?: fällt zurück, sobald die linke Seite falsy ist, also ist 0 ?: 5 gleich 5. ?: warnt außerdem bei undefinierten Variablen und Schlüsseln, ?? nicht.
Was macht ??= in PHP?
$a ??= $b weist $a den Wert $b nur zu, wenn $a null oder nicht gesetzt ist; sonst bleibt $a unverändert. Es ist die Kurzform von $a = $a ?? $b; und kam mit PHP 7.4.
Was ist der Nullsafe-Operator ?-> in PHP?
$obj?->method() ruft die Methode nur auf, wenn $obj nicht null ist; ist es null, liefert die ganze Kette null, statt einen Fehler zu werfen. Kombiniere ihn mit ?? für einen Standardwert: $user?->getAddress()?->city ?? 'unknown'. Er kam mit PHP 8.0.