©Sergey Emelyanov 2025 | Alle Rechte vorbehalten
PHP 8 hat mit dem neuen Ausdruck match ein mächtiges Feature eingeführt, das häufig eine hervorragende Alternative zum herkömmlichen switch-Statement darstellt. Auch wenn match und switch in vielen Fällen ähnlich verwendet werden können, gibt es fundamentale Unterschiede, die match in bestimmten Situationen vorzuziehen machen. In diesem Artikel beleuchten wir die wichtigsten Eigenschaften des match-Ausdrucks, vergleichen ihn mit switch und zeigen, wie man ihn im Alltag sinnvoll einsetzen kann.
Anstatt mehrzeiliger switch-Blöcke wird match als kompakter Ausdruck geschrieben. Ein typisches Beispiel, wie man den Rabatt eines Kunden basierend auf seinem Status zuweist, sieht folgendermaßen aus:
Mit switch:
switch ($clientStatus) {
case 'Open':
case 'Not assigned':
$discount = null;
break;
case 'First buyer':
$discount = 10;
break;
case 'Second buyer':
$discount = 20;
break;
case 'VIP':
$discount = 30;
break;
default:
$discount = 5;
break;
}
Mit match:
$discount = match($clientStatus) {
'Open', 'Not assigned' => null,
'First buyer' => 10,
'Second buyer' => 20,
'VIP' => 30,
default => 5,
};
Wie Sie sehen, benötigt match kein break, da es als Ausdruck immer einen Wert zurückgibt. Mehrere Bedingungen können einfach durch Kommata zusammengefasst werden.
Ein entscheidender Unterschied: match ist ein Ausdruck (expression), während switch ein Statement ist. Das bedeutet, dass Sie das Ergebnis des match-Ausdrucks direkt einer Variablen zuweisen können, was den Code prägnanter und lesbarer macht. Anders als bei switch, wo man in der Regel in jedem case über break den Kontrollfluss beendet, benötigt match das nicht.
Beim Comparing von Werten verwendet match den Identitätsoperator (===) statt des lockeren Vergleichsoperators (==), den switch nutzt. Dies bedeutet, dass nicht nur der Wert, sondern auch der Typ der verglichenen Elemente übereinstimmen muss:
$clientType = "2";
$redirectUrl = match($clientType) {
2 => '/discount',
3 => '/buy',
default => '/',
};
// In diesem Beispiel wird kein Treffer gefunden, da "2" (string) !== 2 (integer).
Dies kann in bestimmten Fällen hilfreich sein, um unerwünschte implizite Typumwandlungen zu verhindern. Gleichzeitig bedeutet es, dass match nicht in allen Szenarien als direkter Ersatz zu switch verwendet werden kann, wenn man automatische Typkonvertierungen erwartet.
Wenn kein passender Fall gefunden wird und kein default definiert ist, wirft match eine UnhandledMatchError-Ausnahme. Dadurch werden potenzielle Fehler frühzeitig erkannt, anstatt unbemerkt weiterzulaufen.
$clientType = 5;
$redirectUrl = match($clientType) {
2 => '/discount',
3 => '/buy',
};
// UnhandledMatchError wird geworfen.
Das zwingende Vorhandensein eines default-Falls bietet eine zusätzliche Sicherheit gegen unerwartete Eingaben.
Match soll in einer einzigen Ausdrucksform geschrieben werden. Das heißt: Komplexe mehrzeilige Logik innerhalb des match-Ausdrucks ist nicht erlaubt. In solchen Fällen müssen Sie entweder den ternären Operator oder eine separate Funktion verwenden. Beachten Sie, dass der match-Ausdruck immer einen konkreten Wert zurückgeben muss.
Match erlaubt die Zusammenfassung mehrerer Bedingungen in einem Fall. Man kann diese einfach durch Kommata trennen:
$discount = match($clientStatus) {
'First buyer', 'Second buyer', 'VIP' => 10,
default => 5,
};
Dies macht den Code übersichtlicher, wenn mehrere Werte zu demselben Ergebnis führen.
Einige Entwickler argumentierten, dass man dieselbe Logik mit assoziativen Arrays erzielen könne – das Ausführen von Funktionsaufrufen während der Array-Erstellung könnte jedoch ineffizient werden. Match hingegen wertet Bedingungen zeilenweise aus. Somit wird die Performance bei komplexeren Entscheidungen gesteigert, insbesondere wenn manche Cases aufwändige Überprüfungen beinhalten.
PHP 8 ermöglicht es, direkt in match-Ausdrücken Ausnahmen zu werfen. Dies ist besonders nützlich, wenn ein bestimmter Wert als unzulässig betrachtet wird:
$discount = match($clientStatus) {
'Open', 'Not assigned' => throw new DomainException('Dieser Kundentyp ist hier nicht erlaubt!'),
'First buyer' => 10,
'Second buyer' => 20,
'VIP' => 30,
default => 5,
};
Dadurch wird der Kontrollfluss sofort unterbrochen und ein Fehler signalisiert, was zur robusteren Fehlerbehandlung beiträgt.
Zusammenfassend lässt sich sagen, dass match eine strengere und modernere Alternative zum switch darstellt. Seine Vorteile liegen in einer kompakteren Syntax, strikten Typvergleichen, direktem Rückgabewert sowie einer besseren Fehlerbehandlung durch zwingende default-Fälle. Dennoch gibt es Szenarien, in denen switch weiterhin sinnvoll ist – beispielsweise wenn automatische Typumwandlung gewünscht ist oder wenn komplexe mehrzeilige Logik notwendig wird.
Fazit
Der neue match-Ausdruck in PHP 8 erweitert die Möglichkeiten, den Code klarer und prägnanter zu gestalten. Er erfüllt vor allem in Fällen, in denen strikte Typprüfung und ein kompakter Format gewünscht sind, seinen Zweck perfekt. Dennoch sollten Sie je nach konkretem Anwendungsfall abwägen, ob match oder switch die beste Wahl darstellt. Mit match können Entwickler sauberere, lesbare und sicherere Entscheidungen in ihren Programmen treffen – eine sinnvolle Erweiterung, die in modernen PHP-Anwendungen nicht fehlen sollte.
©Sergey Emelyanov 2025 | Alle Rechte vorbehalten