Elvis lebt: Vergleich von Short-Ternary und Null Coalescing in PHP

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wer ist Elvis und was hat er mit PHP zu tun?

\n\n

Wenn Sie schon einmal in PHP programmiert haben, sind Ihnen in fremdem Code sicherlich seltsame Konstrukte aufgefallen: $name ?: 'Gast' oder $name ?? 'Gast'. Auf den ersten Blick – dasselbe. Aber tatsächlich verbergen sich hinter diesen beiden Operatoren völlig unterschiedliche Mechanismen, die Ihren Code sowohl retten als auch ein Ei ins Nest legen können.

\n\n

Auf Stack Overflow hat die Frage "PHP short-ternary ("Elvis") operator vs null coalescing operator" Zehntausende von Aufrufen gesammelt. Und das nicht ohne Grund. Entwickler werden verwirrt, machen Fehler und suchen dann lange nach Bugs. Lassen Sie uns ein für alle Mal klären, wer wer ist, und aufhören zu raten.

\n\n

In diesem Artikel werden wir nicht nur die Unterschiede auflisten. Wir werden unter die Haube von PHP schauen, uns reale Fälle aus der Produktion ansehen und verstehen, wann welcher Operator verwendet werden sollte. Los geht's!

\n\n

Kurze Einführung: Was ist das überhaupt?

\n\n

Ternärer Operator (klassisch)

\n

Erinnern wir uns zunächst an die Grundlagen. Der ternäre Operator ist eine Kurzform von if-else:

\n\n
$age = 20;\n$status = ($age >= 18) ? 'Erwachsen' : 'Kind';\n// $status = 'Erwachsen'
\n\n

Ganz einfach: Wenn die Bedingung wahr ist – nimm den ersten Wert, sonst den zweiten.

\n\n

Short-Ternary (auch Elvis-Operator) — ?:

\n

Dies ist eine Abkürzung für den Fall, dass Sie eine Variable auf "Wahrheit" prüfen und ihren eigenen Wert verwenden möchten:

\n\n
$name = 'Alexei';\n$greeting = $name ?: 'Gast';\n// $greeting = 'Alexei'\n\n$name = '';\n$greeting = $name ?: 'Gast';\n// $greeting = 'Gast'
\n\n

Funktioniert so: Wenn $name zu true ausgewertet wird, nehmen wir $name. Sonst – "Gast".

\n\n

Null-Coalescing-Operator — ??

\n

Erschien in PHP 7.0 und wurde sofort zum Liebling der Entwickler:

\n\n
$name = 'Alexei';\n$greeting = $name ?? 'Gast';\n// $greeting = 'Alexei'\n\n$name = null;\n$greeting = $name ?? 'Gast';\n// $greeting = 'Gast'
\n\n

Unterschied zu Elvis: Die Prüfung erfolgt nur auf null, nicht auf "Falschheit" im Allgemeinen.

\n\n

Der Hauptunterschied: Was gilt als "leer"?

\n\n

Hier wird es richtig interessant. Schauen wir uns eine Vergleichstabelle für verschiedene Werte von $value an:

\n\n
$value = false;\necho $value ?: 'default'; // 'default' (false ist "falsch")\necho $value ?? 'default'; // false (false ist NICHT null)\n\n$value = 0;\necho $value ?: 'default'; // 'default' (0 ist "falsch")\necho $value ?? 'default'; // 0 (0 ist NICHT null)\n\n$value = '';\necho $value ?: 'default'; // 'default' (leerer String ist "falsch")\necho $value ?? 'default'; // '' (leerer String ist NICHT null)\n\n$value = [];\necho $value ?: 'default'; // 'default' (leeres Array ist "falsch")\necho $value ?? 'default'; // [] (leeres Array ist NICHT null)\n\n$value = '0';\necho $value ?: 'default'; // 'default' (String "0" ist "falsch"!)\necho $value ?? 'default'; // '0' (String "0" ist NICHT null)
\n\n

Sehen Sie den Unterschied? Elvis arbeitet als Prüfung auf "Wahrheit" (truthy/falsy), während Null Coalescing eine strenge Prüfung auf Existenz und Unterschied zu null ist.

\n\n

Unter der Haube: Wie funktioniert das auf Engine-Ebene

\n\n

Werfen wir einen Blick in die PHP-Quellen (na ja, fast). Wenn Sie jemals PHP aus den Quellen kompiliert haben, wissen Sie, dass beide Operatoren während der Parsing-Phase verarbeitet werden.

\n\n

Short-Ternary (?):

\n

Eigentlich ist das syntaktischer Zucker. $a ?: $b wird zu $a ? $a : $b. Aber es gibt eine Nuance: PHP berechnet $a nicht zweimal. Es speichert das Ergebnis in einer temporären Variable. Dies ist wichtig für Funktionen mit Seiteneffekten:

\n\n
function getData() {\n    echo "Funktion aufgerufen!\\n";\n    return rand(0, 1) ? 'data' : '';\n}\n\n// Elvis ruft die Funktion EINMAL auf\n$result = getData() ?: 'default';\n// "Funktion aufgerufen!" — einmal
\n\n

Wenn PHP $a zweimal berechnen würde,

Blogs

Buchempfehlungen