switch
Das PHP-Schlüsselwort "switch" wertet einen Wert aus und führt je nach Ergebnis unterschiedliche Aktionen aus – als Alternative zu mehreren "if"-Anweisungen.
Die PHP-switch-Anweisung
Die PHP-switch-Anweisung wertet einen Ausdruck aus und führt den Codeblock aus, der zu seinem Wert passt. Sie ist die übersichtlichere Alternative zu einer langen Kette aus if / elseif / else-Anweisungen, wenn dieselbe Variable gegen viele mögliche Werte verglichen wird.
Dieses Kapitel behandelt die Syntax, das wichtige Schlüsselwort break, absichtliches Fall-Through, die alternative endswitch-Syntax und den Fallstrick beim losen Vergleich, über den die meisten Anfänger stolpern.
Syntax
Die grundlegende Syntax einer switch-Anweisung in PHP lautet wie folgt:
<?php
switch ($value) {
case $value1:
// Code block here
break;
case $value2:
// Code block here
break;
default:
// Code block here
}PHP vergleicht $value der Reihe nach mit jedem case. Der erste Treffer gewinnt: Sein Block wird ausgeführt, und break beendet den switch. Stimmt kein case überein, wird der optionale default-Block ausgeführt. default muss nicht am Ende stehen, aber die Konvention erwartet es dort.
Warum break wichtig ist
Die break-Anweisung stoppt die Ausführung und verlässt den switch-Block. Ohne sie führt PHP den Code jedes folgenden case weiter aus, bis es auf ein break oder das Ende des Blocks trifft – dieses Verhalten nennt sich Fall-Through. Das ist der häufigste switch-Fehler:
<?php
$role = "editor";
switch ($role) {
case "admin":
echo "Full access. ";
// no break — execution "falls through" to the next case
case "editor":
echo "Can edit content. ";
break;
case "viewer":
echo "Read only.";
break;
}
// Output: Can edit content.Hier trifft editor zu, gibt seine Meldung aus, und break verlässt den Block sauber. Fehlt das break nach admin, würde ein Admin auch den Code für editor ausführen. Weitere Informationen findet man unter break.
Absichtliches Fall-Through
Fall-Through ist nicht immer ein Fehler. Durch das Stapeln leerer case-Labels können mehrere Werte denselben Block teilen – eine übersichtliche Art, Bedingungen zu gruppieren:
<?php
$month = 2;
switch ($month) {
case 12:
case 1:
case 2:
echo "Winter";
break;
case 3:
case 4:
case 5:
echo "Spring";
break;
default:
echo "Another season";
}
// Output: WinterBeispiele
Hier sind einige praktische Beispiele, wie switch eingesetzt wird:
<?php
// Example 1
$dayOfWeek = "Wednesday";
switch ($dayOfWeek) {
case "Monday":
case "Tuesday":
case "Wednesday":
case "Thursday":
case "Friday":
echo "It's a weekday.";
break;
case "Saturday":
case "Sunday":
echo "It's a weekend.";
break;
}
// Example 2
$grade = "B";
switch ($grade) {
case "A":
echo "Excellent!";
break;
case "B":
echo "Good job!";
break;
case "C":
echo "Could do better.";
break;
default:
echo "Please enter a valid grade.";
}Beispiel 1 gruppiert Wochentagsnamen mit gestapelten case-Labels, um zwischen Werktag und Wochenende zu unterscheiden. Beispiel 2 ordnet einer Schulnote eine Rückmeldung zu, wobei default alle nicht passenden Werte abfängt.
Der Fallstrick beim losen Vergleich
Standardmäßig vergleicht switch mit loser Gleichheit (==), sodass Werte nach Typumwandlung abgeglichen werden – nicht mit striktem ===. Das kann zu überraschenden Treffern führen:
<?php
$value = "1";
switch ($value) {
case 1:
echo "Matched the integer 1!";
break;
default:
echo "Matched default.";
}
// Output: Matched the integer 1!Der string "1" trifft auf den integer case 1, weil == die Typen vor dem Vergleich umwandelt. Wenn eine strikte Typprüfung benötigt wird, empfiehlt sich eine Kette aus if / elseif mit ===, oder der match-Ausdruck (PHP 8+), der strikt vergleicht und einen Wert zurückgibt:
<?php
$grade = "B";
$message = match ($grade) {
"A" => "Excellent!",
"B" => "Good job!",
"C" => "Could do better.",
default => "Please enter a valid grade.",
};
echo $message;
// Output: Good job!match hat kein Fall-Through und benötigt kein break, was eine ganze Klasse von Fehlern vermeidet.
Alternative endswitch-Syntax
Beim Einbetten von PHP in HTML-Templates kann die Doppelpunkt-/endswitch-Form lesbarer wirken:
<?php switch ($status): ?>
<?php case "active": ?>
<span>Active</span>
<?php break; ?>
<?php default: ?>
<span>Inactive</span>
<?php endswitch; ?>Vorteile
- Lesbarkeit — ein
switchist leichter zu überfliegen als vieleif-Anweisungen, wenn dieselbe Variable gegen mehrere Werte verglichen wird. - Einmalige Auswertung — der switch-Ausdruck wird einmal ausgewertet und dann mit jedem
caseverglichen.
Verwandte Kapitel
- PHP if...else...elseif — Verzweigungen bei unterschiedlichen Bedingungen
- PHP break und break vs. continue — Steuerung des Ablaufs
- PHP-Operatoren — Vergleichs- und Gleichheitsoperatoren
- PHP-Schleifen — Codeblöcke wiederholen