W3docs

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: Wednesday

Da $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: Vowel

Mit 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: B

Der 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 Found

Wesentliche Unterschiede:

switchmatch
Vergleichlose (==)strikt (===)
Fall-throughja (braucht break)keines
Gibt einen Wert zurückneinja (es ist ein Ausdruck)
Kein passender Wert, kein defaulttut nichtswirft 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 match

In 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 break hinzufügen nach jedem Case, es sei denn, Sie wollen absichtlich Fall-through (und kommentieren Sie es dann).
  • Ein default einschließen, um unerwartete Werte zu behandeln, statt stillschweigend nichts zu tun.
  • Verwandte Cases gruppieren, indem leere case-Labels gestapelt werden, anstatt Code zu duplizieren.
  • match bevorzugen (PHP 8+), wenn ein Wert zurückgegeben wird oder ein strenger Vergleich nötig ist.
  • if...elseif verwenden, wenn verschiedene Ausdrücke geprüft werden, nicht ein Wert gegen viele.

Verwandte Themen

Übungen

Übung
Welche Anweisungen können in einer switch-Anweisung in PHP verwendet werden?
Welche Anweisungen können in einer switch-Anweisung in PHP verwendet werden?
Was this page helpful?