Что такое match() в PHP 8?

Ответ

match() — это выражение для сопоставления с образцом, введенное в PHP 8. Оно позволяет компактно сопоставить значение с набором условий и вернуть результат.

Основные особенности:

  1. Выражение, а не оператор: Результат match можно использовать напрямую (присваивать, возвращать из функции).
  2. Строгая типизация: Сравнение происходит через ===.
  3. Компактный синтаксис: Не требует break и менее многословен, чем switch.
  4. Исключение при несовпадении: Если совпадений нет и отсутствует 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,
};

Короче, вещь. Прям чувствуется, что язык взрослеет. Правда, привыкать немного надо, а то сначала смотришь и думаешь: «Ни хуя себе, что это за мудя?». А потом вникаешь — и понимаешь, что хитрая жопа, которая реально код чище делает. Бери на вооружение.