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

Ответ

match — это выражение для условного сопоставления, появившееся в PHP 8.0. Оно является более строгой и выразительной альтернативой оператору switch.

Ключевые отличия от switch:

  • Возвращает значение: match — это выражение, результат которого можно присвоить переменной.
  • Строгое сравнение: Используется оператор === (идентично), а не == (равно).
  • Нет проваливания (fall-through): Каждая ветка выполняется независимо, не требуется break.
  • Обязательное совпадение: Если ни одно условие не совпало и не указана ветка default, будет выброшено исключение UnhandledMatchError.

Пример использования:

$httpCode = 404;

$message = match ($httpCode) {
    200, 201 => 'Success',
    301 => 'Moved Permanently',
    404 => 'Not Found',
    500 => 'Internal Server Error',
    default => 'Unknown HTTP Code',
};

echo $message; // Выведет: Not Found

Поддержка выражений в условиях:

$result = match (true) {
    $age < 18 => 'Minor',
    $age >= 18 && $age < 65 => 'Adult',
    default => 'Senior',
};

Ответ 18+ 🔞

А, ну это же про match в PHP! Ёпта, наконец-то додумались сделать нормальную штуку вместо этого старого switch, который только и умел, что баги плодить. Слушай, как будто на дворе 2002-й год — до сих пор некоторые switch используют, а потом удивляются, почему код ведёт себя как пизда с ушами.

В общем, match — это типа условное сопоставление, в PHP 8.0 его запилили. По сути, это строгая и умная замена тому убогому switch. Представь, что switch — это такой распиздяй, который постоянно проваливается куда не надо, а match — это дисциплинированный солдат, который делает всё чётко и возвращает результат.

Чем он круче этого старого switch:

  • Возвращает значение: Это выражение, ёпта! То есть результат можно сразу в переменную воткнуть, не надо никаких костылей. Удобно же, блядь!
  • Строгое сравнение: Работает через === (идентично), а не через это кривое ==, которое может тебе сюрприз подкинуть. Никаких неожиданных приведений типов, всё честно.
  • Нет проваливания (fall-through): Вот это вообще главная фишка. Каждая ветка выполняется отдельно, и не надо после каждого case этот ёбаный break ставить. Забыл break — получил хиросиму в коде. В match такого нет, живи спокойно.
  • Обязательное совпадение: Если ни одно условие не подошло и default не указал — получишь исключение UnhandledMatchError прямо в ебало. Жёстко, зато честно. Не как в switch, который молча сожрёт всё и будет работать дальше, а ты потом будешь искать, почему нихуя не работает.

Смотри, как это выглядит на практике:

$httpCode = 404;

$message = match ($httpCode) {
    200, 201 => 'Success',
    301 => 'Moved Permanently',
    404 => 'Not Found',
    500 => 'Internal Server Error',
    default => 'Unknown HTTP Code',
};

echo $message; // Выведет: Not Found

Видишь? Красиво, ёпта. Никакого лишнего говна. Присвоили и пошли дальше.

А ещё там можно в условиях выражения пихать, это вообще овердохуища! Смотри:

$result = match (true) {
    $age < 18 => 'Minor',
    $age >= 18 && $age < 65 => 'Adult',
    default => 'Senior',
};

Вот это уже мощь! По сути, заменяет кучу if-elseif, только выглядит в разы аккуратнее. В общем, match — это однозначно шаг вперёд. Кто ещё использует switch для новых проектов — тот, прости, полупидор. Всё, я сказал.