Menu

PHP switch: case, break und Fallthrough erklärt

switch ($value) vergleicht einen Wert mit einer Liste von case-Labels und führt den Code ab dem ersten Treffer bis zu einem break aus. Mit mehreren Cases, Fallthrough, default, switch(true) und warum switch mit dem lockeren Vergleich == arbeitet.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

switch ($value) vergleicht einen Wert mit einer Liste von case-Labels und führt den Code unter dem ersten passenden Label aus. Jeder Case endet mit break; default behandelt alles, was zu nichts gepasst hat.

Setze $day auf 'fri', 'sun' oder 'wed' und führe den Code erneut aus. Der Case default braucht kein break, wenn er der letzte ist.

Mehrere Cases für einen Block

Um denselben Code für mehrere Werte auszuführen, stapelst du die case-Labels ohne etwas dazwischen. Ein passendes Label läuft in den Code darunter weiter.

Anders als match hat switch keine Syntax mit Komma wie case 'jpg', 'jpeg':. Gestapelte Labels sind der einzige Weg.

Fallthrough: was ohne break passiert

break ist das, was einen switch stoppt. Ohne break führt PHP den passenden Case aus und läuft dann in jeden Case darunter weiter, ohne deren Labels zu beachten, bis es auf ein break oder das Ende trifft.

Hier ist der Fallthrough gewollt: Jeder Tarif bekommt seine eigenen Features plus alles aus den günstigeren Tarifen. Wenn du das bewusst schreibst, füge einen Kommentar wie // no break hinzu, damit der nächste Leser es nicht „repariert“. Wenn es nicht gewollt war, ist ein fehlendes break einer der häufigsten switch-Bugs.

switch verwendet den lockeren Vergleich (==)

Jeder case wird mit == geprüft, nicht mit ===. Ein numerischer String passt zu einer Zahl, null passt zu false und "", und true passt zu jedem Wert, der als wahr zählt. Tippe auf die Zellen, um die beiden Operatoren zu vergleichen.

switch vergleicht mit ==, match vergleicht mit ===
Point at or tap a cell to read it as PHP.
$a == $b01"0""1"""nullfalsetrue"a""10""1e1"
0
1
"0"
"1"
""
null
false
true
"a"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

Die praktische Folge: Ein Eingabe-String "1" aus einem Formular landet ohne jede Umwandlung in case 1:, und das ist oft genau das, was du willst. Aber switch (true) mit einem nicht leeren String oder null, das auf case false: trifft, kann einen Case wählen, mit dem du nicht gerechnet hast.

Beachte die Zeile mit null: Sie erreicht case false: nie, weil null == 0 schon wahr ist und case 0: zuerst kommt. Beim lockeren Vergleich ändert die Reihenfolge der Cases das Ergebnis. Seit PHP 8 ist 0 == "a" falsch (in PHP 7 war es wahr), also passt ein nicht numerischer String nicht mehr zu case 0:. Wenn du === brauchst, verwende einen match-Ausdruck, behandelt am Ende dieser Seite.

switch(true) für Bereiche und Bedingungen

Ein case-Label kann ein beliebiger Ausdruck sein. Mit switch (true) ist jeder Case eine Bedingung, und die erste, die gleich true ist, gewinnt.

Achte darauf, dass jeder Case ein echter Boolean ist. Wegen des lockeren Vergleichs würde case $name: immer passen, sobald $name ein nicht leerer String ist.

switch in einer Schleife: break und continue

In einer Schleife verlässt break in einem switch nur den switch, nicht die Schleife. Um die Schleife zu stoppen, verwendest du break 2. continue in einem switch verhält sich wie break, und PHP warnt beim Kompilieren: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Schreib continue 2, um zum nächsten Schleifendurchlauf zu springen.

switch vs match

PHP 8 brachte match, das die meisten Einsätze von switch mit weniger Code abdeckt. Es vergleicht mit ===, liefert einen Wert, fällt nie durch, erlaubt durch Kommas getrennte Bedingungen und wirft einen UnhandledMatchError, wenn nichts passt, sodass ein vergessener Case nicht still durchrutschen kann.

Behalte switch, wenn ein Case mehrere Anweisungen braucht oder wenn der Fallthrough der Zweck ist, wie im Tarif-Beispiel. Um einen Wert auf ein Ergebnis abzubilden, ist match kürzer und sicherer.

Häufig gestellte Fragen

Wie verwende ich in einem PHP-switch mehrere Cases für einen Block?

Stapel die case-Labels ohne Code dazwischen: case 'sat': case 'sun': echo 'weekend'; break;. Jedes Label fällt in den gemeinsamen Code durch. PHP hat für switch keine Syntax case 'sat', 'sun':; diese Form mit Komma gehört zu match.

Verwendet switch in PHP den strikten Vergleich?

Nein. switch vergleicht mit dem lockeren ==, also passt case '1': zur Ganzzahl 1 und case 0: zu '0'. Für den strikten Vergleich mit === verwendest du einen match-Ausdruck oder switch (true) mit === in jedem Case.

Was passiert, wenn ich in einem PHP-switch das break vergesse?

Die Ausführung fällt durch: Nach dem passenden Case führt PHP den Code jedes darunterliegenden Case weiter aus, bis es ein break, ein return oder das Ende des switch erreicht. Manchmal ist das gewollt, meist ist es ein Bug.

Kann ein PHP-switch Bereiche wie größer als prüfen?

Ja, mit switch (true): Jeder case enthält eine Bedingung wie case $score >= 90:, und die erste wahre wird ausgeführt. Ein match (true)-Ausdruck macht dasselbe mit striktem Vergleich und liefert einen Wert.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S