Mit PHP 8.0 wurde der match-Ausdruck eingeführt, eine moderne Alternative zur switch-Anweisung. Im Vergleich zu switch ist match kompakter, verwendet strikte Typvergleiche und gibt einen Wert zurück. In vielen Fällen kann match eine switch-Anweisung vollständig ersetzen und sorgt dabei für weniger Code und weniger Fehlerquellen. In diesem Tutorial lernst du die Syntax, die Unterschiede zu switch und wann welche Variante die bessere Wahl ist.

Zunächst wird geklärt, was den match-Ausdruck grundlegend von der bekannten switch-Anweisung unterscheidet.
Was ist der match-Ausdruck?
Der match-Ausdruck ist eine Expression, also ein Ausdruck, der einen Wert zurückgibt. Das unterscheidet ihn grundlegend von switch, das eine Anweisung (Statement) ist. Dadurch kann match direkt in Variablenzuweisungen, return-Anweisungen oder echo verwendet werden.
Grundlegende Syntax
Die Syntax von match besteht aus dem zu prüfenden Wert und einer Liste von Armen. Jeder Arm besteht aus einer Bedingung, einem Pfeil (=>) und dem Ergebniswert.
<?php
$statusCode = 200;
$text = match($statusCode) {
200 => 'OK',
301 => 'Moved Permanently',
404 => 'Not Found',
500 => 'Internal Server Error',
default => 'Unbekannter Status',
};
echo $text;
/* Ausgabe: OK */
Das Ergebnis des match-Ausdrucks wird direkt der Variable $text zugewiesen. Ein break ist nicht nötig, da match automatisch nach dem ersten Treffer abbricht. Wichtig ist das Semikolon nach der schließenden geschweiften Klammer, da der gesamte match-Ausdruck eine Anweisung ist.
match vs. switch: Die wichtigsten Unterschiede
Die Unterschiede zwischen match und switch sind fundamental und betreffen den Vergleichsmodus, den Rückgabewert und das Verhalten bei mehreren Treffern.
Strikter Vergleich statt loser Typpruefung
match verwendet den strikten Vergleich (===), während switch den losen Vergleich (==) nutzt. Das verhindert unerwartetes Verhalten bei Typumwandlungen.
<?php
$wert = '1';
/* switch: loser Vergleich, trifft case 1 */
switch ($wert) {
case 1:
echo 'switch: Integer 1';
break;
}
/* Ausgabe: switch: Integer 1 */
/* match: strikter Vergleich, trifft NICHT Integer 1 */
$ergebnis = match($wert) {
1 => 'Integer 1',
'1' => 'String 1',
default => 'Unbekannt',
};
echo $ergebnis;
/* Ausgabe: String 1 */
Bei switch wird der String '1' mit dem Integer 1 als gleich behandelt. Bei match hingegen wird exakt auf Typ und Wert geprüft. Das macht match vorhersehbarer und sicherer.
Rückgabewert statt Anweisung
match gibt einen Wert zurück und kann deshalb direkt in Zuweisungen oder als Argument verwendet werden. Bei switch muss die Variable innerhalb jedes Cases manuell gesetzt werden.
<?php
$typ = 'admin';
/* Mit switch */
switch ($typ) {
case 'admin':
$rolle = 'Administrator';
break;
case 'editor':
$rolle = 'Redakteur';
break;
default:
$rolle = 'Gast';
}
/* Mit match (kompakter) */
$rolle = match($typ) {
'admin' => 'Administrator',
'editor' => 'Redakteur',
default => 'Gast',
};
Kein Fall-Through
Bei switch werden ohne break alle nachfolgenden Cases ebenfalls ausgeführt (Fall-Through). Das ist eine häufige Fehlerquelle. Bei match gibt es kein Fall-Through. Nur der erste passende Arm wird ausgeführt, danach ist der Ausdruck beendet.
Mehrere Bedingungen pro Arm
Ein match-Arm kann mehrere Werte prüfen, indem sie durch Komma getrennt werden.
<?php
$httpCode = 301;
$kategorie = match($httpCode) {
200, 201, 204 => 'Erfolg',
301, 302 => 'Weiterleitung',
400, 403, 404 => 'Client-Fehler',
500, 502, 503 => 'Server-Fehler',
default => 'Unbekannt',
};
Mehrere Werte im selben Arm funktionieren wie ein logisches ODER: Wenn einer der Werte passt, wird das Ergebnis zurückgegeben.
Für komplexere Bedingungen lässt sich match(true) verwenden. Dabei wird jeder Arm als boolescher Ausdruck ausgewertet. Das Muster match(true) ist besonders nützlich, wenn die Bedingungen keine einfachen Wertvergleiche sind, sondern Bereiche, Funktionsaufrufe oder zusammengesetzte Ausdrücke.
<?php
$code = 403;
$kategorie = match(true) {
$code >= 200 && $code < 300 => 'Erfolg',
$code >= 300 && $code < 400 => 'Weiterleitung',
$code >= 400 && $code < 500 => 'Client-Fehler',
$code >= 500 => 'Server-Fehler',
default => 'Unbekannt',
};
echo $kategorie;
/* Ausgabe: Client-Fehler */
Der default-Arm
Der default-Arm wird ausgeführt, wenn kein anderer Arm passt. Er ist optional, sein Fehlen kann jedoch zu einem Fehler führen. In der Praxis empfiehlt es sich, einen default-Arm immer dann hinzuzufügen, wenn die möglichen Werte nicht vollständig bekannt sind oder sich ändern können.
Was passiert ohne passenden Match?
Wenn kein Arm passt und kein default definiert ist, wirft PHP einen UnhandledMatchError. Das ist ein bewusstes Design, denn es zwingt den Entwickler, alle Fälle abzudecken oder explizit einen default-Arm zu definieren.
match in der Praxis
Der match-Ausdruck eignet sich besonders gut in Kombination mit Enums. Da Enums eine feste Menge von Cases definieren, kann match alle möglichen Werte abdecken, ohne einen default-Arm zu benötigen.
<?php
enum Rolle
{
case Admin;
case Editor;
case Gast;
}
function berechtigung(Rolle $rolle): string
{
return match($rolle) {
Rolle::Admin => 'Voller Zugriff',
Rolle::Editor => 'Inhalte bearbeiten',
Rolle::Gast => 'Nur lesen',
};
}
Wird später ein neuer Enum-Case hinzugefügt, warnt PHP mit einem UnhandledMatchError, falls der match-Ausdruck nicht aktualisiert wurde. Das erhöht die Wartbarkeit des Codes.
Wann switch statt match verwenden?
Obwohl match in vielen Fällen die bessere Wahl ist, gibt es Situationen, in denen switch weiterhin sinnvoll bleibt. Match-Arme können nur einen einzelnen Ausdruck enthalten, keine Blöcke mit mehreren Anweisungen. Wenn pro Fall mehrere Zeilen Code ausgeführt werden müssen, ist switch die passende Wahl. Auch das bewusste Fall-Through-Verhalten von switch kann in bestimmten Szenarien gewollt sein.
flowchart TD
A["match(statusCode)"] --> B{"200?"}
B -->|Ja| C["'OK'"]
B -->|Nein| D{"301?"}
D -->|Ja| E["'Moved Permanently'"]
D -->|Nein| F{"404?"}
F -->|Ja| G["'Not Found'"]
F -->|Nein| H{"default?"}
H -->|Ja| I["'Unbekannt'"]
H -->|Nein| J["UnhandledMatchError"]
Fazit
Der match-Ausdruck in PHP 8 ist eine kompaktere und sicherere Alternative zu switch. Durch strikte Vergleiche, einen Rückgabewert und das Fehlen von Fall-Through werden viele typische Fehlerquellen eliminiert. In Kombination mit Enums bildet match ein mächtiges Werkzeug für saubere Fallunterscheidungen. Für einfache Zuordnungen ist match fast immer die bessere Wahl, während switch für mehrzeilige Blöcke und bewusstes Fall-Through weiterhin seinen Platz hat. Das Verständnis beider Konstrukte ist für die Arbeit mit modernen PHP-Projekten unverzichtbar.