Null coalescing in PHP

Heute habe ein neuen Feature von PHP kennengelernt, das wirklich praktisch ist: Null coalesing mit dem tenären Operator. (Ok, das klingt für ungeübte Ohren vielleicht ein bisschen seltsam :))

Null coalescing ist ein Feature dass viele Programmiersprachen haben, meistens mit Hilfe des Operators „??“ (Zwei Fragezeichen). Der Ausdruck gibt den linken Wert zurück, wenn dieser nicht null ist, ansonsten den rechten. Also z.B. so:


action = getAction() ?? 'save';

Wenn getAction() einen Wert ungleich Null zurückliefert wird dieser der Variable action zugewiesen, ansonsten wird der Standardwert „save“ verwendet. Sehr praktisch um Default-Werte unterzubringen. Natürlich kann man den Operator auch verketten:


action = getAction() ?? getOtherAction() ?? 'save';

C# kennt diesen Operator schon ewig, in PHP wurde er erst mit Version 7 eingeführt. Natürlich lässt dich ähnliches Verhalten auch ohne den Operator (also z.B. vor PHP 7) erzielen. Ganz brachial mit einem if:


if (getAction() != null) {

$action = getAction();

}

//alternativ:

if (getAction()) {

$action = getAction();

}

Dieser Code lässt sich natürlich mit Hilfe des tenären Operators noch ein bisschen kürzer schreiben:


$action = getAction() ? getAction() : 'save';

Hierbei bleibt natürlich das Problem, dass getAction() zweimal ausgewertet wird. Außerdem macht sich dieser Code in der Version zu nutze, dass für PHP ein Nullwert als false behandelt wird. Wenn jetzt aber getAction() z.B. den String „0“ zurück gibt (der auch als false behandelt wird) funktioniert der Code evtl. nicht wie gewünscht.

Zumindest das Problem mit der zweifachen Auswertung (und der Codeduplizierung) lässt sich lösen (und das war mir neu!):


$action = getAction ?: 'save';

Der zweite Teil des Operator wurde also einfach weggelassen. Und ja, das funktioniert, und das schon seit PHP 5.3. Diesen Operator nennt man dann übrigens auch „Elvis Operator“ 😉

Bleibt noch als letztes die Frage, warum dann überhaupt ein neuer Operator mit PHP 7 her musste. Die Unterschiede liegen im Detail: Zum einen prüft der Null coalescing Operator wirklich nur auf null, und nicht auf einen Wert der äquivalent zu false ist, und als zweites gibt er keine Warnung aus, wenn im linken Teil ein Variable benutzt wird, die es nicht gibt. Kleines Beispiel:


$a = '0' ?: 'x'; //$a=='x'

$a = '0' ?? 'x'; //$a=='0'

$a = $y ?: 'x'; //Warnung, weil $y nicht definiert

$a = $y ?? 'x'; //Keine Warnung

Insbesondere der Umgang mit nicht gesetzten Variablen ist ungemein praktisch um Default-Werte für GET/POST-Parameter anzugeben:


//PHP 5.3, mit Warnung

$action = $_GET['action'] :? 'save';

//PHP 5.3, ohne Warnung

$action = isset($_GET['action']) ? $_GET['action'] : 'save';

//PHP 7

$action = $_GET['action'] ?? 'save';

Soviel für heute zu kleinen, aber gelegentlich netten Features von PHP. Soll ja auch ihre guten Seiten haben, die Sprache 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert