(PHP 8)
Der match
-Ausdruck verzweigt die Auswertung auf
der Grundlage einer Identitätsprüfung eines Wertes. Ähnlich wie eine
switch
-Anweisung, hat ein
match
-Ausdruck ein Subjekt, welcher mit
mehreren Fällen verglichen wird. Im Gegensatz zu switch ist der
Vergleich typsicher (===
) und nicht typschwache (==
).
Match-Ausdrücke sind ab PHP 8.0.0 verfügbar.
Beispiel #1 Struktur eines match
-Ausdrucks
<?php
$return_value = match (subjekt) {
einfacher_bedingter_ausdruck => rückgabe_ausdruck,
bedingter_ausdruck1, bedingter_ausdruck2 => rückgabe_ausdruck,
};
?>
Beispiel #2 Grundlegende Benutzung von match
<?php
$lebensmittel = 'kuchen';
$return_value = match ($lebensmittel) {
'apfel' => 'Das Lebensmittel ist ein Apfel',
'schokolade' => 'Das Lebensmittel ist Schokolade',
'kuchen' => 'Das Lebensmittel ist ein Kuchen',
};
var_dump($return_value);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
string(31) "Das Lebensmittel ist ein Kuchen"
Hinweis: Das Ergebnis eines
match
-Ausdrucks muss nicht verwendet werden.
Hinweis: Ein
match
-Ausdruck muss mit einem Semikolon;
abgeschlossen werden.
Der Ausdruck match
ist ähnlich wie eine
switch
-Anweisung, hat aber einige wesentliche Unterschiede:
match
-Fall vergleicht Werte typsicher (===
)
statt typschwach, wie die switch-Anweisung.
match
-Ausdruck gibt einen Wert zurück.
match
-Fälle fallen nicht auf spätere Fälle durch, so wie
es switch
-Fälle tun können.
match
-Ausdruck muss vollständig sein.
Wie switch
-Anweisungen, werden
match
-Ausdrücke Fall für Fall ausgeführt.
Zu Beginn wird kein Code ausgeführt.
Die bedingten Ausdrücke werden nur ausgewertet, wenn alle vorherigen bedingten
Ausdrücke nicht mit dem betreffenden Ausdruck übereinstimmen.
Nur der Rückgabeausdruck, der dem passenden bedingten
Ausdruck entspricht, wird ausgewertet.
Ein Beispiel dafür:
<?php
$result = match ($x) {
foo() => ...,
$this->bar() => ..., // $this->bar() wird nicht aufgerufen, wenn foo() === $x
$this->baz => beep(), // beep() wird nur aufgerufen, wenn $x === $this->baz
// etc.
};
?>
match
-Bedingungen können mehrere Ausdrücke, die durch Kommata
getrennt sind, enthalten. Diese Ausdrücke werden durch ein logisches ODER
getrennt und sind ein Kürzel für mehrere match
-Fälle,
welche die gleiche rechte Seite haben.
<?php
$result = match ($x) {
// Dieser Fall:
$a, $b, $c => 5,
// ist der gleiche Fall wie:
$a => 5,
$b => 5,
$c => 5,
};
?>
Ein Sonderfall ist die default
-Klausel.
Diese fängt alle Fälle ab, die nicht durch einen der anderen Fälle behandelt wurden.
Zum Beispiel:
<?php
$expressionResult = match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};
?>
Hinweis: Mehrere default-Anweisungen erzeugen einen
E_COMPILE_ERROR
-Fehler.
Ein match
-Ausdruck muss vollständig sein. Wenn
die Bedingung von keinem Fall behandelt wird, wird eine
UnhandledMatchError-Exception geworfen.
Beispiel #3 Beispiel für einen unbehandelten Vergleichsausdruck
<?php
$bedingung = 5;
try {
match ($bedingung) {
1, 2 => foo(),
3, 4 => bar(),
};
} catch (\UnhandledMatchError $e) {
var_dump($e);
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
object(UnhandledMatchError)#1 (7) { ["message":protected]=> string(33) "Unhandled match value of type int" ["string":"Error":private]=> string(0) "" ["code":protected]=> int(0) ["file":protected]=> string(9) "/in/ICgGK" ["line":protected]=> int(6) ["trace":"Error":private]=> array(0) { } ["previous":"Error":private]=> NULL }
Es ist möglich, einen match
-Ausdruck zu verwenden,
um nicht-vergleichende Fälle zu behandeln, indem true
als
Bedingung verwendet wird.
Beispiel #4 Prüfung von ganzzahligen Bereichen
<?php
$alter = 23;
$result = match (true) {
$alter >= 65 => 'Senior',
$alter >= 25 => 'Erwachsener',
$alter >= 18 => 'Junger Erwachsener',
default => 'Kind',
};
var_dump($result);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
string(18) "Junger Erwachsener"
Beispiel #5 Prüfung eines Textes auf enthaltene Zeichenfolgen
<?php
$text = 'Bienvenue chez nous';
$result = match (true) {
str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en',
str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr',
// ...
};
var_dump($result);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
string(2) "fr"