Ответ
match() — это выражение для сопоставления с образцом, введенное в PHP 8. Оно позволяет компактно сопоставить значение с набором условий и вернуть результат.
Основные особенности:
- Выражение, а не оператор: Результат
matchможно использовать напрямую (присваивать, возвращать из функции). - Строгая типизация: Сравнение происходит через
===. - Компактный синтаксис: Не требует
breakи менее многословен, чемswitch. - Исключение при несовпадении: Если совпадений нет и отсутствует
default, выбрасываетсяUnhandledMatchError.
Практический пример с обработкой статуса заказа:
function getOrderStatusText(string $status): string {
return match ($status) {
'new' => 'Order received',
'processing' => 'Preparing your order',
'shipped' => 'On the way',
'delivered' => 'Delivered',
'cancelled' => 'Cancelled',
default => throw new InvalidArgumentException('Invalid order status'),
};
}
echo getOrderStatusText('shipped'); // On the way
Сравнение нескольких значений и использование условий:
$discount = match (true) {
$user->isPremium() && $total > 1000 => 0.15, // 15%
$total > 500 => 0.10,
$total > 100 => 0.05,
default => 0.0,
}; Ответ 18+ 🔞
Э, слушай, смотри, что за прикол придумали в PHP 8. Этот match() — ну просто ёперный театр по сравнению со старым switch. Раньше же этот switch — пизда рулю, честно. Забудешь break поставить — и всё, поехали по всем веткам, как угорелые.
А тут — выражение, понимаешь? То есть можно сразу в переменную засунуть или из функции вернуть. И сравнение у него строгое, через ===, а не это вот «примерно похоже», от которого потом волнение ебать, где баг вылезет.
Вот смотри, как красивше стало. Раньше бы статус заказа обрабатывал так:
switch ($status) {
case 'new':
$text = 'Order received';
break;
case 'processing':
$text = 'Preparing your order';
break;
// ... и так далее, с кучей break'ов
default:
throw new InvalidArgumentException('Invalid order status');
}
А теперь? Красота, ядрёна вошь!
function getOrderStatusText(string $status): string {
return match ($status) {
'new' => 'Order received',
'processing' => 'Preparing your order',
'shipped' => 'On the way',
'delivered' => 'Delivered',
'cancelled' => 'Cancelled',
default => throw new InvalidArgumentException('Invalid order status'),
};
}
echo getOrderStatusText('shipped'); // On the way
Видишь? Ни одного лишнего слова. Чисто, аккуратно. И если статус кривой прилетит и default нет — он тебе сразу UnhandledMatchError в морду бросит, а не будет молча как хуй с горы сидеть.
А ещё вот эта фишка — match (true). Это вообще песня, когда условия сложные. Раньше бы нагородил if-ов овердохуища.
$discount = match (true) {
$user->isPremium() && $total > 1000 => 0.15, // 15%
$total > 500 => 0.10,
$total > 100 => 0.05,
default => 0.0,
};
Короче, вещь. Прям чувствуется, что язык взрослеет. Правда, привыкать немного надо, а то сначала смотришь и думаешь: «Ни хуя себе, что это за мудя?». А потом вникаешь — и понимаешь, что хитрая жопа, которая реально код чище делает. Бери на вооружение.