PHP Switch-Anweisung: Ein umfassender Leitfaden
Die PHP switch-Anweisung steuert den Programmfluss und prüft einen Ausdruck gegen mehrere Werte. Mit Beispielen und PHP 8 match-Vergleich erklärt.
Die PHP switch-Anweisung vergleicht einen Ausdruck mit einer Liste möglicher Werte und führt den passenden Block aus. Sie ist die übersichtlichere Alternative zu einer langen Kette von if...elseif...else-Anweisungen, wenn dieselbe Variable gegen viele feste Werte geprüft wird.
Diese Seite behandelt die Syntax, wie Vergleiche und Fall-through tatsächlich funktionieren, ausführbare Beispiele, die PHP 8 match-Alternative sowie häufige Fallstricke.
Syntax
switch (expression) {
case value1:
// runs when expression == value1
break;
case value2:
// runs when expression == value2
break;
default:
// runs when nothing above matched
}Der expression wird einmal ausgewertet. Das Ergebnis wird dann von oben nach unten mit jedem case-Wert per losem Vergleich (==) verglichen. Beim ersten Treffer beginnt PHP, die Anweisungen ab diesem case auszuführen und läuft weiter, bis es auf ein break trifft (oder das Ende des switch erreicht). Der optionale default-Block wird ausgeführt, wenn kein case zutrifft — per Konvention steht er am Ende.
Ein funktionierendes Beispiel
Dieses Beispiel ordnet einer Tagesnummer einen Namen zu und gibt das Ergebnis aus:
<?php
$day = 3;
switch ($day) {
case 1:
echo "Monday";
break;
case 2:
echo "Tuesday";
break;
case 3:
echo "Wednesday";
break;
default:
echo "Another day";
}
// Output: WednesdayDa $day den Wert 3 hat, trifft der dritte case zu, "Wednesday" wird ausgegeben, und break stoppt die Ausführung vor dem default-Block.
Warum break wichtig ist: Fall-through
Vergisst man ein break, „fällt" die Ausführung in den nächsten Case und läuft weiter, bis sie eines findet. Dies ist der häufigste switch-Fehler:
<?php
$role = "editor";
switch ($role) {
case "editor":
echo "Can edit. ";
// no break — falls through!
case "viewer":
echo "Can view.";
break;
}
// Output: Can edit. Can view.Hier traf "editor" zu, aber ohne break führte PHP auch den viewer-Block aus.
Absichtliches Fall-through (Fälle gruppieren)
Fall-through ist gelegentlich nützlich: Durch das Stapeln leerer Cases können mehrere Werte denselben Block teilen.
<?php
$letter = "e";
switch ($letter) {
case "a":
case "e":
case "i":
case "o":
case "u":
echo "Vowel";
break;
default:
echo "Consonant";
}
// Output: VowelMit einer Bedingung und true switchen
Ein switch kann auch eine if...elseif-Kette für Bereichsprüfungen ersetzen. Switcht man auf true und setzt einen booleschen Ausdruck in jeden case:
<?php
$score = 82;
switch (true) {
case $score >= 90:
echo "A";
break;
case $score >= 80:
echo "B";
break;
case $score >= 70:
echo "C";
break;
default:
echo "F";
}
// Output: BDer erste case, dessen Ausdruck true ergibt, gewinnt — die Reihenfolge ist daher entscheidend: Die engste Bedingung kommt zuerst.
switch vs. match (PHP 8+)
PHP 8 fügte den match-Ausdruck hinzu, ein strengeres Geschwister von switch. Greifen Sie auf match zurück, wenn Sie einen Wert einfach einem Ergebnis zuordnen möchten:
<?php
$status = 404;
$message = match ($status) {
200, 201 => "Success",
404 => "Not Found",
500 => "Server Error",
default => "Unknown",
};
echo $message;
// Output: Not FoundWesentliche Unterschiede:
switch | match | |
|---|---|---|
| Vergleich | lose (==) | strikt (===) |
| Fall-through | ja (braucht break) | keines |
| Gibt einen Wert zurück | nein | ja (es ist ein Ausdruck) |
Kein passender Wert, kein default | tut nichts | wirft UnhandledMatchError |
Fallstrick beim losen Vergleich
Da switch == verwendet, kann ein numerisches 0 in älterem Code mit einem nicht leeren string übereinstimmen. In PHP 8+ wurden die Vergleichsregeln für Zeichenketten und Zahlen verschärft, aber halten Sie die Typen konsistent, um Überraschungen zu vermeiden:
<?php
$value = 0;
switch ($value) {
case "hello":
echo "matched hello";
break;
default:
echo "no match";
}
// Output (PHP 8+): no matchIn PHP 7 hätte derselbe Code matched hello ausgegeben, weil 0 == "hello" true war. Im Zweifelsfall match für den strikten Vergleich verwenden.
Best Practices
- Immer
breakhinzufügen nach jedem Case, es sei denn, Sie wollen absichtlich Fall-through (und kommentieren Sie es dann). - Ein
defaulteinschließen, um unerwartete Werte zu behandeln, statt stillschweigend nichts zu tun. - Verwandte Cases gruppieren, indem leere
case-Labels gestapelt werden, anstatt Code zu duplizieren. matchbevorzugen (PHP 8+), wenn ein Wert zurückgegeben wird oder ein strenger Vergleich nötig ist.if...elseifverwenden, wenn verschiedene Ausdrücke geprüft werden, nicht ein Wert gegen viele.
Verwandte Themen
- PHP If...Else...Elseif — bedingte Verzweigung
- PHP Operators — Vergleiche und der
match-Ausdruck - PHP Loops — Codeblöcke wiederholen