Der ternäre Operator ist ein if/else, das in einen einzigen Ausdruck passt: condition ? valueIfTrue : valueIfFalse. Er liefert einen der beiden Werte, du kannst ihn also zuweisen, mit echo ausgeben oder an eine Funktion übergeben.
Ändere $age auf 15 und $items auf 3 und führe den Code erneut aus. Beachte die Klammern um den Ternär-Ausdruck in der letzten Zeile: Ohne sie würde der . zuerst die Strings verbinden, und das Ergebnis wäre nicht das gewünschte.
Ternärer Operator in HTML-Templates
Mit einem Ternär-Ausdruck wählt man in einem Template üblicherweise eine CSS-Klasse, eine Beschriftung oder ein Attribut. Dieser Block liest ?stock= aus der URL: Führe ihn aus, klicke dann im Tab Page auf die Links, und dasselbe Skript läuft erneut mit einem anderen Wert.
<?= ... ?> ist die Kurzform von <?php echo ... ?> und hält einzeilige Bedingungen im Markup lesbar.
Kurzer Ternär-Operator ?: (der Elvis-Operator)
Lass den mittleren Teil weg, und du bekommst $a ?: $b: Es liefert $a, wenn $a truthy ist, sonst $b. Das ist praktisch für Standardwerte, wenn auch ein leerer String oder 0 auf den Ersatz zurückfallen soll.
Falsy sind false, 0, 0.0, "", "0", [] und null. Wenn "0" in deinen Daten eine echte Antwort ist (ein Mengenfeld, eine PIN), wirft der kurze Ternär-Operator sie weg.
?: vs ??
Sie sehen sich ähnlich, prüfen aber Verschiedenes. ?: fällt auf den Ersatz zurück, wenn die linke Seite falsy ist. ?? fällt nur zurück, wenn die linke Seite null oder nicht gesetzt ist, und warnt nicht bei einer fehlenden Variable oder einem fehlenden Array-Schlüssel.
Verwende ?? für „der Wert existiert vielleicht nicht“ (Request-Daten, Konfigurations-Arrays, optionale Schlüssel). Verwende ?: für „der Wert existiert, ist aber vielleicht leer“. Die Seite zum Null-Coalescing-Operator behandelt ?? und ??= im Detail.
Verschachtelte Ternäre brauchen Klammern
PHP 7 las a ? b : c ? d : e von links nach rechts, anders als fast jede andere Sprache, und lieferte falsche Ergebnisse. PHP 8 weigert sich zu raten:
<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2
Setze Klammern um den inneren Ternär-Ausdruck, dann funktioniert es:
Die Ausnahme ist der kurze Ternär-Operator: $a ?: $b ?: $c ist ohne Klammern erlaubt, wie im Elvis-Beispiel oben.
match(true) bei mehr als zwei Zweigen
Ein verschachtelter Ternär-Ausdruck mit drei oder vier Ebenen ist selbst mit Klammern schwer zu lesen. match mit true als Subjekt prüft Bedingungen von oben nach unten und liefert den ersten passenden Zweig:
Behalte den ternären Operator für zwei Ergebnisse in einer Zeile, und greif zu match oder einer if/elseif-Kette, sobald du ein drittes brauchst.
Häufig gestellte Fragen
Was ist der ternäre Operator in PHP?
Eine Kurzform von if/else, die einen Wert liefert: $label = $age >= 18 ? 'adult' : 'minor';. Ist die Bedingung vor ? wahr, wird der Ausdruck nach ? verwendet, sonst der nach :.
Was bedeutet ?: in PHP?
$a ?: $b ist der kurze Ternär-Operator (auch Elvis-Operator genannt). Er liefert $a, wenn $a truthy ist, sonst $b, also ist '' ?: 'default' gleich 'default'. Das entspricht $a ? $a : $b, aber $a wird nur einmal ausgewertet.
Kann man ternäre Operatoren in PHP verschachteln?
Nur mit Klammern. Seit PHP 8 ist $a ? 'x' : $b ? 'y' : 'z' ein fataler Fehler, also schreibst du $a ? 'x' : ($b ? 'y' : 'z'). Bei mehr als zwei Zweigen ist match(true) oder eine if/elseif-Kette leichter zu lesen.
Kann ich einen ternären Operator ohne else-Teil verwenden?
Nein, der ternäre Operator braucht immer beide Zweige. Für „nimm diesen Wert oder einen Ersatz“ schreibst du $x ?: 'default' oder $x ?? 'default'; um nur etwas zu tun, wenn eine Bedingung gilt, schreibst du ein normales if oder $condition && doSomething();.