PHP Handbuch
Zurück | Kapitel 11. Kontroll-Strukturen | Nach vorne

# `switch`

Die `switch`-Anweisung ist gleichbedeutend einer Reihe von IF-Anweisungen mit dem gleichen Parameter. Häufig wollen Sie ein und die selbe Variable (bzw. den selben Ausdruck) mit verschiedensten Werten vergleichen und in Abhängigkeit vom Auswertungsergebnis verschiedene Programmteile ausführen. Genau das ermöglicht die `switch`-Anweisung.

Die folgenden 2 Beispiele zeigen 2 verschiedene Wege, das gleiche zu bewirken; eins gebraucht mehrere `if`-Befehle, das andere eine `switch`-Anweisung:

    if ($i == 0) {
        print "i ist gleich 0";
    }
    if ($i == 1) {
        print "i ist gleich 1";
    }
    if ($i == 2) {
        print "i ist gleich 2";
    }

    switch ($i) {
        case 0:
            print "i ist gleich 0";
            break;
        case 1:
            print "i ist gleich 1";
            break;
        case 2:
            print "i ist gleich 2";
            break;
    }

Es ist wichtig, die Ausführung einer `switch`-Anweisung zu verstehen, um Fehler zu vermeiden. Die `switch`-Anweisung wird Zeile für Zeile (also Anweisung für Anweisung) abgearbeitet. Zu Beginn wird nichts ausgeführt. Erst wenn bei einem `case`-Teil eine Entsprechung zum `switch`-Ausdruck vorliegt, werden die darin enthaltenen Befehle ausgeführt. PHP fährt dann mit der Abarbeitung des restlichen Codes innerhalb des `switch`-Blocks fort (oder bis zum ersten Auftreten einer `break`-Anweisung). Ohne `break` am Ende eines case-Teils werden also noch die folgenden case-Blöcke ausgeführt. Z.B.:

    switch ($i) {
        case 0:
            print "i ist gleich 0";
        case 1:
            print "i ist gleich 1";
        case 2:
            print "i ist gleich 2";
    }

Wenn hier $i gleich 0 ist, würde PHP alle print-Anweisungen ausführen. Ist $i gleich 1, würden die letzten beiden print-Befehle ausgeführt und wenn $i = 2 ist, würde nur der letzte print-Befehl ausgeführt. Deshalb ist es wichtig, bei der ersten gefundenen Übereinstimmung eine `break`-Anweisung zu setzen (abgesehen von bestimmten Fällen, wo genau dieses Verhalten gefordert wird).

Bei einer `switch`-Anweisung wird die Bedingung also nur einmal überprüft und das Ergebnis mit jeder `case`-Anweisung verglichen. Bei einem `elseif`-Befehl wird die Bedingung neu geprüft. Eine `switch`-Anweisung kann schneller als mehrere `if`-Befehle sein, z.B. bei komplizierteren Bedingungen als einem einfachen Vergleich.

Der Anweisungsteil von case kann auch leer sein. Dann wird die Kontrolle einfach an den nächsten case-Teil übergeben.

    switch ($i) {
        case 0:
        case 1:
        case 2:
            print "i ist kleiner als 3 aber nicht negativ";
            break;
        case 3:
            print "i ist gleich 3";
    }

Ein Spezialfall ist die Anweisung default. Diese trifft auf alles zu, was nicht von den voranstehenden case-Ausdrücken erfasst wurde, wie z.B.:

    switch ($i) {
        case 0:
            print "i ist gleich 0";
            break;
        case 1:
            print "i ist gleich 1";
            break;
        case 2:
            print "i ist gleich 2";
            break;
        default:
            print "i ist weder 0, 1 noch 2";
    }

Der `case`-Ausdruck kann eine Prüfung einfacher Typen sein, also von Integer- oder Fließkomma-Zahlen oder von Strings / Zeichenketten. Arrays oder Objekte können nicht benutzt werden, es sei denn, sie werden auf einfache Typen herunter gebrochen.

Die alternative Syntax gilt auch für switch-Sequenzen. Mehr Informationen dazu unter Alternative Syntax für Kontroll-Strukturen .

    switch ($i):
        case 0:
            print "i ist gleich 0";
            break;
        case 1:
            print "i ist gleich 1";
            break;
        case 2:
            print "i ist gleich 2";
            break;
        default:
            print "i ist weder 0, 1 noch 2";
    endswitch;

Zurück | Zum Anfang | Nach vorne
`continue` | Nach oben | require()