Beim Zugriff auf Variablen, Array-Elemente oder GET-Parameter in PHP besteht immer das Risiko, dass ein Wert nicht gesetzt oder null ist. Vor PHP 7 musste dafür jedes Mal eine isset() Abfrage in Kombination mit dem Ternär-Operator geschrieben werden. Der Null Coalescing Operator ?? löst dieses Problem seit PHP 7 auf elegante Weise. Er prüft, ob ein Wert existiert und nicht null ist, und gibt andernfalls einen Standardwert zurück. Dieses Tutorial erklärt die Funktionsweise, zeigt die Verkettung mehrerer Fallback-Werte und grenzt den Operator klar vom Ternär-Operator sowie dem Elvis-Operator ab.

Zunächst wird die grundlegende Funktionsweise des Operators anhand einfacher Beispiele gezeigt.
Was ist der Null Coalescing Operator?
Der Null Coalescing Operator ?? wurde mit PHP 7 eingeführt und prüft, ob der linke Operand existiert und nicht null ist. Falls ja, wird der linke Wert zurückgegeben. Falls der linke Operand nicht gesetzt oder null ist, wird stattdessen der rechte Operand als Fallback verwendet.
<?php
/* Syntax des Null Coalescing Operators */
$ergebnis = $wert ?? 'Standardwert';
/* Entspricht dieser isset()-Prüfung */
$ergebnis = isset($wert) ? $wert : 'Standardwert';
Der entscheidende Vorteil gegenüber der isset() Variante ist die Kürze und Lesbarkeit. Außerdem erzeugt ?? keine Notice bei nicht definierten Variablen, da die Existenzprüfung bereits eingebaut ist.
Einfache Beispiele
Der Operator eignet sich besonders gut für den Zugriff auf GET-Parameter, Array-Elemente und optionale Variablen.
<?php
/* GET-Parameter mit Standardwert */
$benutzername = $_GET['name'] ?? 'Gast';
echo "Hallo, {$benutzername}!";
/* Gibt "Hallo, Gast!" aus, wenn name nicht in der URL steht */
/* Array-Zugriff absichern */
$config = ['db_host' => 'localhost'];
$port = $config['db_port'] ?? 3306;
echo $port; /* 3306 */
/* Nicht gesetzte Variable */
$farbe = $lieblingsfarbe ?? 'blau';
echo $farbe; /* blau */
In allen drei Fällen würde ohne den ?? Operator eine Notice oder ein umständliches isset() Konstrukt nötig sein. Der Null Coalescing Operator macht den Code kompakter und gleichzeitig sicherer.
Verkettung von ??
Mehrere ?? Operatoren lassen sich hintereinander verketten, um eine Fallback-Kette zu bilden. PHP prüft die Werte von links nach rechts und gibt den ersten zurück, der existiert und nicht null ist.
<?php
$config = ['db_host' => null];
$host = $config['db_host']
?? getenv('DB_HOST')
?? '127.0.0.1';
echo $host;
/* Falls db_host null ist und die Umgebungsvariable
DB_HOST nicht existiert, wird 127.0.0.1 verwendet */
Diese Verkettung ist besonders nützlich bei Konfigurationssystemen, in denen Werte aus mehreren Quellen stammen können. Der letzte Wert in der Kette dient dabei als finaler Standardwert, der immer greift.
Null Coalescing Assignment (??=)
Seit PHP 7.4 gibt es den Null Coalescing Assignment Operator ??=. Er weist einer Variablen nur dann einen Wert zu, wenn sie aktuell null oder nicht gesetzt ist.
<?php
$optionen = ['farbe' => 'rot'];
/* Nur setzen, wenn nicht vorhanden oder null */
$optionen['groesse'] ??= 'M';
$optionen['farbe'] ??= 'blau';
print_r($optionen);
/*
Array
(
[farbe] => rot
[groesse] => M
)
*/
/* farbe bleibt rot, da der Wert bereits existiert */
/* groesse wird auf M gesetzt, da der Key fehlte */
Der ??= Operator ist besonders praktisch beim Initialisieren von Standardwerten in Konfigurationsarrays oder beim Setzen von Standardeigenschaften in Objekten.
Unterschied: ?? vs. Ternär-Operator vs. Elvis-Operator
Die drei Operatoren ??, ?: und der vollständige Ternär-Operator verhalten sich bei bestimmten Werten unterschiedlich. Das folgende Diagramm zeigt die Entscheidungslogik der beiden wichtigsten Varianten im Vergleich.
flowchart TD
A["$a ?? $b"] --> B{"Existiert $a und ist nicht null?"}
B -->|Ja| C["Ergebnis: $a"]
B -->|Nein| D["Ergebnis: $b"]
E["$a ?: $b"] --> F{"Ist $a truthy?"}
F -->|Ja| G["Ergebnis: $a"]
F -->|Nein| H["Ergebnis: $b"]
Der zentrale Unterschied liegt in der Prüfung. Während ?? ausschließlich auf null und „nicht gesetzt“ prüft, bewertet der Elvis-Operator ?: den Wert auf „falsy“. Das führt bei leeren Strings, 0 und false zu unterschiedlichen Ergebnissen.
<?php
/* Leerer String */
$a = '' ?? 'Fallback';
echo $a; /* '' (leerer String ist nicht null) */
$b = '' ?: 'Fallback';
echo $b; /* Fallback (leerer String ist falsy) */
/* Die Zahl 0 */
$c = 0 ?? 'Fallback';
echo $c; /* 0 (Null ist nicht null) */
$d = 0 ?: 'Fallback';
echo $d; /* Fallback (0 ist falsy) */
/* false */
$e = false ?? 'Fallback';
echo $e; /* false (false ist nicht null) */
$f = false ?: 'Fallback';
echo $f; /* Fallback (false ist falsy) */
Der ?? Operator ist daher immer dann die richtige Wahl, wenn 0, leere Strings oder false als gültige Werte erhalten bleiben sollen. Der Elvis-Operator ?: eignet sich hingegen, wenn alle falsy Werte durch einen Standardwert ersetzt werden sollen.
Unterschied: ?? vs. Nullsafe-Operator (?->)
Der Nullsafe-Operator ?-> wurde mit PHP 8.0 eingeführt und dient einem völlig anderen Zweck. Er bricht Methodenketten ab, sobald ein Zwischenergebnis null ist, und gibt in diesem Fall null zurück. Der ?? Operator hingegen liefert einen konkreten Fallback-Wert. Beide Operatoren lassen sich hervorragend kombinieren: Mit ?-> wird eine sichere Methodenkette aufgebaut, und ?? liefert am Ende den Standardwert, falls das Ergebnis null ist.
Fazit
Der Null Coalescing Operator ?? gehört seit PHP 7 zu den wichtigsten Werkzeugen für sauberen und sicheren Code. Er ersetzt umständliche isset() Konstrukte durch eine kompakte Syntax, unterstützt die Verkettung mehrerer Fallback-Werte und erzeugt keine Notices bei nicht definierten Variablen. Der ??= Operator seit PHP 7.4 vereinfacht zusätzlich das bedingte Zuweisen von Standardwerten. Entscheidend ist die Abgrenzung zum Elvis-Operator ?:, der auf falsy Werte prüft, während ?? ausschließlich null und nicht gesetzte Variablen behandelt.