Выражение match
переходит к оценке на основе проверки подлинности значения. Подобно switch
оператору, match
выражение имеет подлежащее выражение, которое сравнивается с несколькими альтернативами. В отличие от switch
, он будет оцениваться как значение, очень похожее на троичные выражения. В отличие от switch
, сравнение является проверкой идентичности ( ===
), а не слабой проверкой равенства ( ==
). Выражения соответствия доступны начиная с PHP 8.0.0.
Пример #1 Структура match
выражения
<?php
$return_value = match (subject_expression) {
single_conditional_expression => return_expression,
conditional_expression1, conditional_expression2 => return_expression,
};
?>
Пример #2 Базовое match
использование
<?php
$food = 'cake';
$return_value = match ($food) {
'apple' => 'This food is an apple',
'bar' => 'This food is a bar',
'cake' => 'This food is a cake',
};
var_dump($return_value);
?>
Приведенный выше пример выведет:
string(19) "Эта еда - торт"
Примечание . Необязательно использовать результат
match
выражения.
Примечание . Выражение должно заканчиваться точкой с запятой .
match;
Выражение match
похоже на switch
оператор, но имеет некоторые ключевые отличия:
- Рука
match
сравнивает значения строго (===
), а не произвольно, как это делает оператор switch. - Выражение
match
возвращает значение. match
оружие не проваливается в более поздние случаи, какswitch
это делают утверждения.- Выражение
match
должно быть исчерпывающим.
Как switch
операторы, match
выражения выполняются последовательное соответствие друг другу. В начале код не выполняется. Условные выражения оцениваются только в том случае, если все предыдущие условные выражения не соответствуют выражению субъекта. Будет оцениваться только возвращаемое выражение, соответствующее соответствующему условному выражению. Например:
<?php
$result = match ($x) {
foo() => ...,
$this->bar() => ..., // $this->bar() isn't called if foo() === $x
$this->baz => beep(), // beep() isn't called unless $x === $this->baz
// etc.
};
?>
match
плечи выражений могут содержать несколько выражений, разделенных запятой. Это логическое ИЛИ, и это сокращение для нескольких спичечных плеч с одной и той же правой стороной.
<?php
$result = match ($x) {
// This match arm:
$a, $b, $c => 5,
// Is equivalent to these three match arms:
$a => 5,
$b => 5,
$c => 5,
};
?>
Особый случай — default
узор. Этот шаблон соответствует всему, что ранее не соответствовало. Например:
<?php
$expressionResult = match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};
?>
Примечание . Использование нескольких шаблонов по умолчанию вызовет
E_FATAL_ERROR
ошибку.
Выражение match
должно быть исчерпывающим. Если подлежащее выражение не обрабатывается ни одной из ветвей совпадения, выдается ошибка UnhandledMatchError .
Example #3 Пример необработанного выражения совпадения
<?php
$condition = 5;
try {
match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
};
} catch (\UnhandledMatchError $e) {
var_dump($e);
}
?>
Приведенный выше пример выведет:
объект(UnhandledMatchError)#1 (7) {
["сообщение":защищено]=>
string(33) "Необработанное значение совпадения типа int"
["строка":"Ошибка":личное]=>
строка(0) ""
["код":защищено]=>
интервал (0)
["файл":защищено]=>
string(9) "/in/ICgGK"
["строка":защищено]=>
интервал(6)
["след":"Ошибка":частный]=>
массив (0) {
}
["предыдущий":"Ошибка":личное]=>
НУЛЕВОЙ
}
Использование выражений совпадения для обработки проверок без идентификации
Можно использовать match
выражение для обработки условных случаев, не являющихся идентификаторами, используя true
в качестве выражения субъекта.
Пример #4 Использование выражений обобщенного соответствия для ветвления по целочисленным диапазонам
<?php
$age = 23;
$result = match (true) {
$age >= 65 => 'senior',
$age >= 25 => 'adult',
$age >= 18 => 'young adult',
default => 'kid',
};
var_dump($result);
?>
Приведенный выше пример выведет:
string(11) "молодой взрослый"
Пример #5 Использование обобщенных выражений соответствия для ветвления по строковому содержимому
<?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);
?>
Приведенный выше пример выведет:
строка(2) "фр"
0 комментариев