W3docs

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

Beispiele

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 switch ist leichter zu überfliegen als viele if-Anweisungen, wenn dieselbe Variable gegen mehrere Werte verglichen wird.
  • Einmalige Auswertung — der switch-Ausdruck wird einmal ausgewertet und dann mit jedem case verglichen.

Verwandte Kapitel

Übung

Übung
Unter welchen Umständen kann eine 'switch'-Anweisung in PHP verwendet werden?
Unter welchen Umständen kann eine 'switch'-Anweisung in PHP verwendet werden?
Was this page helpful?