match ($value) { ... } vergleicht einen Wert strikt mit === mit einer Liste von Zweigen und liefert das Ergebnis des ersten passenden Zweigs. Mehrere Werte können sich einen Zweig teilen, default fängt den Rest ab, und wenn nichts passt, wirft PHP einen UnhandledMatchError.
Beachte das Semikolon nach der schließenden Klammer: match ist ein Ausdruck, wie 1 + 2, also ist das Ganze eine einzige Zuweisung. Jeder Zweig hat die Form values => result, getrennt durch Kommas, und nach dem letzten Zweig ist ein abschließendes Komma erlaubt.
Mehrere Werte in einem Zweig
Liste die Werte mit Kommas auf. Der Zweig passt, wenn das Subjekt mit einem von ihnen identisch (===) ist.
match direkt aus einer Funktion zurückzugeben, wie hier, ist die häufigste Art, es zu verwenden.
match vs switch
Dieselbe Zuordnung auf beide Arten geschrieben, mit einer Eingabe, die den größten Unterschied zeigt: den Vergleich. switch verwendet ==, also passt der String "1" zu case 1. match verwendet ===, also nicht.
match | switch | |
|---|---|---|
| Vergleich | strikt === | locker == |
| Ergebnis | liefert einen Wert | Anweisung, liefert nichts |
| Fallthrough | nie | ja, bis break |
| Mehrere Werte | 1, 2 => | gestapelt case 1: case 2: |
| Kein Treffer | wirft UnhandledMatchError | tut nichts |
| Rumpf eines Zweigs | ein Ausdruck | beliebig viele Anweisungen |
Verwende match, wenn du einen Wert in einen anderen umwandelst. Behalte switch, wenn ein Zweig mehrere Anweisungen braucht oder wenn der Fallthrough der Zweck ist; die Seite zu switch zeigt beide Fälle.
UnhandledMatchError: wenn kein Zweig passt
Ohne default-Zweig ist ein Wert, der zu nichts passt, ein Fehler und kein stilles null. Das ist gewollt: Ein neuer Statuscode oder ein Tippfehler scheitert laut, statt durchzurutschen.
PHP stoppt mit PHP Fatal error: Uncaught UnhandledMatchError: Unhandled match case of type string. Eine Entwicklungsumgebung (mit ausgeschaltetem zend.exception_ignore_args) nennt stattdessen den Wert: Unhandled match case 'XL'. Behebe es entweder, indem du default => 'other' hinzufügst, oder indem du den Fehler dort abfängst, wo ein unbekannter Wert zu erwarten ist:
match(true) für Bereiche und Bedingungen
match vergleicht das Subjekt mit jedem Zweig, also kann jeder Zweig eine Bedingung sein, wenn das Subjekt true ist. Die erste Bedingung, die genau true ergibt, gewinnt.
Zwei Details in diesem Block. throw ist seit PHP 8 ein Ausdruck und kann deshalb das Ergebnis eines Zweigs sein. Und weil der Vergleich strikt ist, muss jede Bedingung einen echten Boolean liefern: Ein Zweig wie $name => ... passt nie zu true, selbst wenn $name ein nicht leerer String ist. Nur der passende Zweig wird ausgewertet, also läuft das throw nur bei einem negativen Alter.
match mit Enums
match und Enums passen zusammen: In einer Enum-Methode ordnet match ($this) jedem Case einen Wert zu. Zu Enums selbst siehe PHP-Enums.
Hier gibt es absichtlich kein default. Wenn später jemand einen fünften Case hinzufügt, wirft der Aufruf von color() dafür einen Fehler, statt eine falsche Farbe zu liefern.
Mehrere Anweisungen in einem Zweig
Ein Zweig enthält einen Ausdruck, also ist 'save' => { ...; ... } kein gültiges PHP. Verschieb die Arbeit in eine Funktion und ruf sie im Zweig auf. Die Funktionen der nicht passenden Zweige werden nie aufgerufen.
Ändere $format auf 'json' oder 'xml' und führe den Code erneut aus.
Häufig gestellte Fragen
Was ist der Unterschied zwischen match und switch in PHP?
match vergleicht strikt mit ===, liefert einen Wert, fällt nie in den nächsten Zweig durch, akzeptiert mehrere durch Kommas getrennte Werte pro Zweig und wirft einen UnhandledMatchError, wenn kein Zweig passt. switch vergleicht locker mit ==, ist eine Anweisung ohne Rückgabewert, fällt ohne break durch und tut still nichts, wenn kein Case passt.
Was passiert, wenn in einem PHP-match-Ausdruck kein Zweig passt?
PHP wirft einen UnhandledMatchError. Füge einen Zweig default => ... für alle anderen Werte hinzu oder fang den Fehler mit try { ... } catch (\UnhandledMatchError $e) { ... } ab.
Wie verwende ich match in PHP mit Bedingungen wie größer als?
Vergleiche gegen true: match (true) { $age < 13 => 'child', $age < 18 => 'teen', default => 'adult' }. Jeder Zweig ist eine Bedingung, und die erste, die genau true ist, gewinnt.
Kann ein match-Zweig in PHP mehrere Anweisungen ausführen?
Nein, jeder Zweig ist ein einzelner Ausdruck. Pack die Anweisungen in eine Funktion oder Methode und ruf sie im Zweig auf, zum Beispiel 'export' => exportCsv($rows).
Mit welcher PHP-Version kam match?
Mit PHP 8.0. Unter PHP 7 braucht dieselbe Logik eine switch-Anweisung oder einen Array-Lookup wie $labels[$status] ?? 'Unknown'.