match · PHP Manual
Вираз match розгалужує виконання на основі перевірки тотожності значення. Як і інструкція switch, вираз match має subject-вираз, який порівнюється з кількома альтернативами. На відміну від switch, він обчислюється у значення, подібно до тернарних виразів. На відміну від switch, порівняння виконується через перевірку тотожності (===), а не через слабку перевірку рівності (==). Вирази match доступні з PHP 8.0.0.
Приклад: структура виразу match
<?php
$return_value = match (subject_expression) {
single_conditional_expression => return_expression,
conditional_expression1, conditional_expression2 => return_expression,
};
Приклад: базове використання 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) "This food is a cake"
Приклад використання match з операторами порівняння
<?php
$age = 18;
$output = match (true) {
$age < 2 => "Baby",
$age < 13 => "Child",
$age <= 19 => "Teenager",
$age >= 40 => "Adult",
$age > 19 => "Young adult",
};
var_dump($output);
Наведений вище приклад виведе:
string(8) "Teenager"
Результат виразу
matchне обовʼязково використовувати.
Коли вираз
matchвикористовується як самостійний вираз, він мусить завершуватися крапкою з комою;.
Вираз match схожий на інструкцію switch, але має кілька ключових відмінностей:
- Гілка
matchпорівнює значення строго (===), а не нестрого, як це робить інструкція switch. - Вираз
matchповертає значення. - Гілки
matchне «провалюються» в наступні випадки так, як це роблять інструкціїswitch. - Вираз
matchмає бути вичерпним.
Як і інструкції switch, вирази match виконуються гілка за гілкою. На початку не виконується жоден код. Умовні вирази обчислюються лише тоді, коли всі попередні умовні вирази не збіглися з subject-виразом. Обчислюється тільки той вираз повернення, який відповідає умовному виразу, що збігся. Наприклад:
<?php
$result = match ($x) {
foo() => 'value',
$this->bar() => 'value', // $this->bar() не викликається, якщо foo() === $x
$this->baz => beep(), // beep() не викликається, поки $x !== $this->baz
// тощо
};
Гілки виразу match можуть містити кілька виразів, розділених комою. Це логічне АБО і скорочений запис для кількох гілок match з однаковою правою частиною.
<?php
$result = match ($x) {
// Ця гілка match:
$a, $b, $c => 5,
// Рівнозначна цим трьом гілкам match:
$a => 5,
$b => 5,
$c => 5,
};
Окремий випадок - шаблон default. Цей шаблон збігається з усім, що не збіглося раніше. Наприклад:
<?php
$expressionResult = match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};
Кілька шаблонів default спричинять помилку
E_FATAL_ERROR.
Вираз match має бути вичерпним. Якщо subject-вираз не обробляється жодною гілкою match, кидається UnhandledMatchError.
Приклад необробленого виразу match
<?php
$condition = 5;
try {
match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
};
} catch (\UnhandledMatchError $e) {
var_dump($e);
}
Наведений вище приклад виведе:
object(UnhandledMatchError)#1 (7) {
["message":protected]=>
string(22) "Unhandled match case 5"
["string":"Error":private]=>
string(0) ""
["code":protected]=>
int(0)
["file":protected]=>
string(6) "script"
["line":protected]=>
int(5)
["trace":"Error":private]=>
array(0) {
}
["previous":"Error":private]=>
NULL
}
Використання виразів match для перевірок, відмінних від тотожності
Вираз match можна використати для обробки умовних випадків, не пов'язаних із перевіркою тотожності, якщо взяти true як subject-вираз.
Використання узагальненого виразу match для розгалуження за діапазонами цілих чисел
<?php
$age = 23;
$result = match (true) {
$age >= 65 => 'senior',
$age >= 25 => 'adult',
$age >= 18 => 'young adult',
default => 'kid',
};
var_dump($result);
Наведений вище приклад виведе:
string(11) "young adult"
Використання узагальненого виразу match для розгалуження за вмістом рядка
<?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);
Наведений вище приклад виведе:
string(2) "fr"
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.