Чем конструкция match отличается от switch в PHP?

«Чем конструкция match отличается от switch в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Конструкция 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) и позволяет использовать его прямо в выражениях, например, в аргументах функций или при присваивании.