switch
(PHP 4, PHP 5, PHP 7, PHP 8)
Die switch
-Anweisung entspricht in etwa einer
Folge von if
-Anweisungen die jeweils den gleichen
Ausdruck prüfen. Es kommt oft vor, dass man dieselbe Variable (oder
denselben Ausdruck) gegen viele verschiedene mögliche Werte prüfen
und abhängig davon unterschiedlichen Code ausführen möchte. Genau
hierfür wurde die switch
-Anweisung eingeführt.
Hinweis:
Beachten Sie, dass im Unterschied zu einigen anderen Sprachen die
continue-Anweisung
auch auf switch
anwendbar ist und sich ähnlich wie break
verhält. Wenn Sie ein switch
innerhalb einer Schleife verwenden und
mit dem nächsten Schleifendurchlauf beginnen wollen so müssen Sie in
diesem Fall continue 2
angeben.
Hinweis:
Beachten Sie auch, dass switch/case
typschwache Vergleiche
durchführt.
Im folgenden Beispiel sind die beiden Codeblöcke gleichwertig.
Der eine verwendet eine Reihe von if
- und
elseif
-Anweisungen und der andere eine
switch
-Anweisung. Die Ausgabe ist in beiden Fällen
dieselbe.
Beispiel #1 switch
-Anweisung
<?php
// This switch statement:
switch ($i) {
case 0:
echo "i ist gleich 0";
break;
case 1:
echo "i ist gleich 1";
break;
case 2:
echo "i ist gleich 2";
break;
}
// Is equivalent to:
if ($i == 0) {
echo "i ist gleich 0";
} elseif ($i == 1) {
echo "i ist gleich 1";
} elseif ($i == 2) {
echo "i ist gleich 2";
}
?>
Um Fehler zu vermeiden ist es wichtig zu verstehen wie eine
switch
-Anweisung ausgeführt wird. Eine
switch
-Anweisung wird zeilenweise (genauer: Anweisung für
Anweisung) ausgewertet. Zunächst einmal wird überhaupt kein Code ausgeführt.
Erst wenn eine case
-Anweisung gefunden wird, deren
Ausdruck zu einem Wert evaluiert, der dem an switch
übergebenen Ausdruck entspricht, beginnt PHP tatsächlich die folgenden
Anweisungen auszuführen. Die Ausführung wird fortgesetzt bis das Ende
der switch
-Anweisung erreicht ist oder bis PHP
bei der Ausführung auf eine break
-Anweisung stößt.
Wenn Sie am Ende der Anweisungsliste eines case kein
break
setzen, so wird die Ausführung mit dem nächsten
case fortgesetzt, z. B.:
Wenn in diesem Beispiel $i gleich 0 ist, führt PHP alle
echo-Anweisungen aus! Ist $i gleich 1, führt PHP die
letzten beiden echo-Anweisungen aus. Sie erreichen das erwartete Verhalten
nur, wenn $i gleich 2 ist. Daher ist es wichtig
break
-Anweisungen nicht zu vergessen (auch wenn Sie
gelegentlich absichtlich darauf verzichten werden, diese unter bestimmten
Bedingungen anzugeben).
In einer switch
-Anweisung wird die Bedingung nur einmal
ausgewertet und das Ergebnis mit jeder case
-Anweisung
verglichen. In einer elseif
-Anweisung wird die Bedingung
erneut ausgewertet. Wenn Ihre Bedingung komplizierter ist als ein einfacher
Vergleich, und/oder sich in einer dichten Schleife befindet, kann ein
switch
schneller sein.
Die Anweisungsliste eines case kann ebenso leer sein, was einfach die
Kontrolle an die Anweisungsliste des nächsten case übergibt.
Ein Sonderfall ist die default
-Klausel. Diese fängt alles
ab, was nicht durch eine der anderen case-Klauseln behandelt wurde. Zum
Beispiel:
Hinweis:
Mehrere default case-Anweisungen erzeugen einen
E_COMPILE_ERROR
-Fehler.
Hinweis:
Technisch gesehen kann der default
-Case an einer
beliebigen Stelle stehen. Er wird nur verwendet, wenn kein anderer Fall
passt. Nach gängiger Praxis ist es jedoch am besten, ihn als letzten Punkt
ans Ende zu setzen.
Wenn kein case
-Zweig passt und es keinen
default
-Zweig gibt, dann wird kein Code ausgeführt,
genauso wie wenn keine if
-Anweisung true
wäre.
Ein case-Wert kann als Ausdruck angegeben werden. Dieser Ausdruck wird
jedoch für sich allein ausgewertet und dann nur einfach mit dem switch-Wert
verglichen. Das bedeutet, dass er nicht für komplexe Auswertungen des
switch-Wertes verwendet werden kann. Zum Beispiel:
Für komplexere Vergleiche kann der Wert true
als Switch-Wert verwendet
werden. Statt switch
können alternativ auch
if
-else
-Blöcke verwendet werden.
Die alternative Syntax für Kontrollstrukturen wird von switch-Anweisungen
unterstützt. Weitere Information entnehmen Sie dem Abschnitt
Alternative Syntax für Kontrollstrukturen.
Es ist möglich, ein Semikolon anstelle eines Doppelpunkts nach einem case zu
verwenden, wie: