Der ternäre Operator ist sicherlich vielen bekannt und je nach Vorliebe verhasst oder beliebt:
1 2 3 4 5 6 7 8 9 10 11 12 |
// long statement if ($a == 1) { echo "a ist 1"; } else { echo "a ist nicht 1"; } // short statement with ternary operator "?:" echo ($a == 1 ? "a ist 1" : "a ist nicht 1"); |
Kurz gesagt: hinter dem Fragezeichen in der Kurzform steht die Anweisung oder Zuordnung die ausgeführt wird, wenn die Bedingung $a == 1 wahr ist. Hinter dem Doppelpunkt steht dann dementsprechend das Gegenstück, also das was passiert wenn die Bedingung falsch ist. Die Klammerung im obigen Beispiel ist optional.
Sonderfälle bei der Anwendung des ternären Operators:
Wird nur abgefragt, ob ein Wert vorhanden ist (nicht empty , NULL , '0' oder false) ohne diesen mit einem konkreten Gegenstück zu vergleichen, so kann die o.g. Schreibweise weiter verkürzt werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// long statement, echo the value of $a if there is one that is not NULL, empty, 0 or false if ($a) { echo $a; } else { echo "nichts auszugeben hier"; } // short statement with ternary operator "?:" // echoes the value of $a if there is one or the "else" part after the ":" echo ($a ?: "nichts auszugeben hier"); |
Sollte $a nicht definiert sein, so wird ein E_WARNING ausgegeben – und damit kommen wir auch schon zum zweiten Sonderfall. Soll die Ausgabe des E_WARNING verhindert werden, wäre eine zusätzliche Prüfung isset($a) erforderlich. Diese Verkettung von Operationen wiederum verhindert die Nutzung der Kurzform. Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// long statement // echo the value of $a if there is one that is not NULL, empty, 0 or false // prevent E_WARNING by using isset() if (isset($a) && $a) { echo $a; } else { echo "nichts auszugeben hier"; } // 1: wrong short statement with ternary operator "?:" // echoes (boolean) "true" or "nichts auszugeben hier" echo (isset($a) && $a ?: "nichts auszugeben hier"); // 2: this short statement does exactly the same as the long statement echo (isset($a) && $a ? $a : "nichts auszugeben hier"); // 3: correct short statement with operator "??" echo $a ?? "nichts auszugeben hier"; |
Das erste obere Beispiel gibt true zurück, falls $a definiert ist und nicht empty , NULL , '0' oder false. Gewollt war in diesem Fall aber, den Wert von $a auszugeben (Beispiel 2). Das ist mit der Anweisung ?? zu erreichen (Beispiel 3).
Übersichtlichkeit im Code
Um den Quelltext übersichtlich zu gestalten gibt es hier mehrere Möglichkeiten, die der Situation entsprechend genutzt werden können.
Mehrere Zuweisungen mit ternärem Operator, hier ist u.U. eine mit Tabs eingerückte Schreibweise vorteilhaft:
1 2 3 4 |
// indent multiple assignments to improve readability $a = $input == '1' ? 'Richtig' : 'Falsch'; $b = $input >= '2' ? 'Das ist zu viel' : 'Könnte sein'; $c = $a == 'Richtig' ? 'Gut gemacht' : 'Nochmal bitte'; |
Bei einzelnen Zuordnungen bevorzuge ich die Schreibform in mehreren Zeilen:
1 2 3 4 |
// multiline with indents to improve readability $greeting = $post['name'] == 'Hans' ? 'Hallo Hans' : 'Hallo Fremder'; |
Verkettung von mehreren Operationen:
Die mehrfache/verkettete Verwendung kann zu schwer les- bzw. interpretierbarem Code führen, daher hier nur der Vollständigkeit halber. Anweisungen müssen hierbei in Klammern eingefasst sein, damit korrekt damit umgegangen wird:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// multiple ternary operators in one line $a = $b > 0 ? ($c == 0 ? 'win' : 'loose') : 'loose'; // better: concat with logic operators if possible, use brackets to improve readability $a = ($b > 0 && $c == 0) ? 'win' : 'loose'; // here concatenation is not possible $a = $b > 0 ? ($c == 0 ? 'best' : 'good') : 'bad'; // use long statement and indents to improve readability if ($b > 0) { $a = $c == 0 ? 'best' : 'good'; } else { $a = 'bad'; } |