Der Trinitäts-Operator kann verwendet werden, um Zuweisungen/Funktionsaufrufe in Verbindung mit einer Bedingung bzw. Abfrage stark zu verkürzen. Richtig eingesetzt erhöht er die Lesbarkeit des Quelltextes und vermindert die Schreibarbeit.
In diesem Artikel wird erklärt, wie der Trinitäts-Operator (engl. Ternary Operator, auch Fragezeichenoperator oder dreifach konditionaler Operator genannt) funktioniert, und wie man ihn richtig anwendet.
Funktionsweise
Der Trinitäts-Operator stellt im Grunde eine Fallunterscheidung in Verbindung mit einer Zuweisung oder einem Funktionsaufruf dar. Man möchte einer Variablen entweder Wert 1, oder Wert 2 zuweisen, abhängig von einer Bedingung. Oder: Man möchte, abhängig von einer Bedingung entweder Funktion X oder Funktion Y aufrufen. Dadurch, dass man sich das if/else sparen kann, und den Variablennamen nur einmal schreiben muss, wird das ganze nicht nur kürzer, sondern auch übersichtlicher.
Abfrage/Zuweisung mit if
Würde man eine solche Zuweisung mit einer normalen if/else-Abfrage realisieren, bräuchte man 5 Zeilen. Das sähe wie folgt aus:
if (<Bedingung>) {
<Variable> = <Wert 1>;
} else {
<Variable> = <Wert 2>;
}Abfrage/Zuweisung mit if (verkürzt)
Eine solche if-Abfrage lässt sich natürlich noch verkürzen. Die geschweiften Klammern können weggelassen werden, und man kann alles in eine Zeile quetschen.
if (<Bedingung>) <Variable> = <Wert 1>; else <Variable> = <Wert 2>;
Abfrage/Zuweisung mit dem Trinitäts-Operator.
Mit dem Trinitäts-Operator wird die Zuweisung dann noch kürzer, und wenn man den Trinitäts-Operator kennt, ist auch sofort ersichtlich, was diese Zeile tut.
<Variable> = (<Bedingung>) ? <Wert 1> : <Wert 2>;
Beispiel
Und noch ein Beispiel, mit richtigen Werten.
// Normale Form if ($antwort1 == 42 && $antwort2 == 1337) { $allesrichtig = true; } else { $allesrichtig = false; } // Verkürzte Form if ($antwort1 == 42 && $antwort2 == 1337) $allesrichtig = true; else $allesrichtig = false; // Trinitäts-Operator $allesrichtig = ($antwort1 == 42 && $antwort2 == 1337) ? true : false;
Man schreibt also zuerst die Bedingung (in Klammern), dann ein Fragezeichen und den Wert den die Variable annehmen soll, wenn die Bedingung wahr ist, dann einen Doppelpunkt, und den Wert für den Fall das die Bedingung unwahr ist.
Noch kürzer
Seit PHP 5.3 gibt es noch eine weitere Form des Trinitäts-Operators, mit der sich manche Zuweisungen noch weiter verkürzen lassen.
<Variable> = <Variable/Bedingung> ?: <Wert>;
Dabei wird true hat (oder dazu umgewandelt werden kann). Ist das der Fall, bekommt die Variable den Wert der Bedingung zugewiesen, ansonsten den anderen Wert.
Hier noch ein Beispiel, welches das ganze vielleicht etwas besser verdeutlicht:
$id = @$_GET['id'] ?: 0;
Wenn $_GET['id'] gesetzt, und ungleich 0 ist, nimmt $id den Wert von $_GET['id'] an. Ansonsten bekommt $id den Wert 0. Das @ steht da, damit PHP nicht über eine undeklarierte Variable meckert, falls $_GET['id'] nicht gesetzt ist.
Funktionen aufrufen
Der Trinitäts-Operator kann auch in Verbindung mit Funktionsaufrufen verwendet werden. Dabei ist es auch möglich mehrere Funktionen aufzurufen. Von letzterem rate ich allerdings ab, in den meisten Fällen wird das schnell unübersichtlich. Wie es funktioniert erkläre ich allerdings trotzdem: Um mehrere Funktionen im Trinitäts-Operator zu verwenden, müssen diese mittels AND verbunden werden, eine Trennung mittels Semikolon oder && funktioniert nicht.
$allesrichtig ? print("Alle Fragen wurden richtig beantwortet, super!") AND die("Das Quiz ist zu Ende.") : die("Leider falsch!");
Es ist übrigens auch möglich, den Trinitätsoperator innerhalb von Zeichenketten zu verwenden:
echo 'Bitte ' . ($siezen ? 'klicken Sie ' : 'klicke ') . 'hier, ' . 'um zur vorherigen Seite zurückzukehren';
So nicht!
Der Trinitäts-Operator kann zwar verschachtelt werden, davon rate ich aber ab. Solche Zuweisungen werden schnell sehr unübersichtlich.
// Unübersichtlich: $allesrichtig = ($antwort1 == 42 && $antwort2 == 1337) ? (($antwort3 > $antwort4) ? ((0 === 0) ? true : false) : false) : false;
Beispiel-Datei
Eine Beispieldatei, mit allen möglichen Formen der Verwendung des Trinitäts-Operators habe ich auch noch erstellt: Beispiel.phps

Du hast noch eine weitere Möglichkeit des Einsatzes übersehen. Ich finde es zwar gerade auf php.net nicht, aber soweit ich mich erinnere geht auch folgendes:
[Bedingung] ? [Variable 1] = [Wert 1] : [Variable 2] = [Wert 2];
Ist aber vermutlich eher ein Sonderfall.