Ответ
Конструкция match, появившаяся в PHP 8.0, является более строгим и выразительным аналогом switch. Вот ключевые отличия:
| Критерий | match |
switch |
|---|---|---|
| Возвращаемое значение | Выражение, возвращает результат выбранной ветки. | Конструкция, выполняет блок кода. Результат нужно сохранять в отдельную переменную. |
| Сравнение | Строгое (===). |
Нестрогое (==). |
| Проверка нескольких значений | Нет. Проверяет одно значение. | Да, через несколько case. |
| Обязательность покрытия | Должна охватывать все возможные значения или иметь default. Иначе выбрасывается UnhandledMatchError. |
default не обязателен. Если совпадения нет и default нет, код просто пропускается. |
Необходимость break |
Не нужен. Выполняется только одна ветка. | Требуется break, иначе выполнение "проваливается" дальше. |
| Условия в ветках | Поддерживает выражения (можно делать проверки). | Только константные значения в case. |
Практический пример:
// Использование match (возвращает значение)
$statusCode = 404;
$message = match ($statusCode) {
200, 201 => 'Успех', // Несколько значений через запятую
404 => 'Не найдено',
500 => 'Ошибка сервера',
default => 'Неизвестный статус', // Обязательно для неохваченных случаев
};
echo $message; // Вывод: Не найдено
// match с условиями
$age = 25;
$category = match (true) {
$age < 18 => 'Ребёнок',
$age >= 18 && $age < 65 => 'Взрослый',
default => 'Пенсионер',
};
// Эквивалент на switch (более многословный)
switch ($statusCode) {
case 200:
case 201:
$message = 'Успех';
break;
case 404:
$message = 'Не найдено';
break;
case 500:
$message = 'Ошибка сервера';
break;
default:
$message = 'Неизвестный статус';
break; // break здесь тоже нужен для consistency
}
match делает код чище, безопаснее (исключает ошибку пропуска break) и позволяет использовать его прямо в выражениях, например, в аргументах функций или при присваивании.