match !== switch

match !== switch

Вже відносно давно — починаючи з PHP 8.0 — зʼявився новий інструмент: match. Але практика співбесід (як джунів, так і мідлів) показує, що багато хто, в кращому випадку, просто знає про нього, але не використовує у повсякденному коді. Основна причина — поверхневе розуміння: існує думка, що це просто ще один синтаксичний цукор над switch чи if/else.

Але це не так.

Спробую пояснити, чому match — це окремий інструмент зі своїми перевагами і призначенням.

1. match повертає значення

match — це вираз, а не інструкція. Він завжди повертає результат, який потрібно привласнити змінній:

$taxRate = match($countryCode) {
    'UA' => 0.20,
    'PL' => 0.23,
    'DE' => 0.19,
    default => 0.0,
};

switch та if/else, на відміну від цього, нічого не повертають. Якщо ви хочете отримати результат — доводиться оголошувати змінну перед умовою, потім в кожному кейсі встановлювати їй значення.

2. Обовʼязкове покриття всіх кейсів

match зобовʼязує розробника обробити всі можливі варіанти або вказати default. Якщо не вказано відповідність — буде UnhandledMatchError. Це значно знижує ризики неочевидних помилок.

$action = match($input) {
    'start' => 'Запуск',
    'stop' => 'Зупинка',
    default => 'Пауза',
};

У switch та if/else будь-який відсутній case просто проігнорується.

3. Завжди суворе порівняння (===), а не вільне (==)

У match значення порівнюються суворо — без приведення типів. Це ще один реверанс PHP в бік суворої типізації і плюс до безпеки та передбачуваності:

match(0) {
    false => 'false', // ❌ UnhandledMatchError
    0 => 'zero',      // ✅ буде виконано
};

switch (0) {
    case false:
        echo 'false';  // ✅ буде виведено
        break;
    case 0:
        echo 'zero';   // ❌ сюди не дійде
        break;
}

switch у цьому випадку вибере false як відповідність до 0, що може призвести до неочікуваної поведінки.

4. Немає fallthrough і break

У switch завжди є ризик забути break, і тоді код "провалиться" в наступний кейс. Це класичне джерело помилок. У match кожен кейс — це окреме правило, і немає поняття break чи переходу до наступного.

Хто не знає, про що мова, просто виконайте цей код:

$value = 2;
switch ($value) {
    case 1:
        echo 'one';
    case 2:
        echo 'two';
    case 3:
        echo 'three';
}

5. Виховує декларативність

match заохочує до декларативного стилю — без зайвої логіки в тілі конструкції. Він не дозволяє писати довгі блоки коду в кожному кейсі, лише вирази. Це змушує структурувати код краще:

return match(true) {
    $x > 0 => 'позитивне',
    $x < 0 => 'негативне',
    default => 'нуль',
};

6. Продуктивність: O(1) доступ по значенню

match працює аналогічно хеш-мапі: якщо йдеться про скалярні значення (int, float, string, bool), він здійснює пошук у константний час — по складності алгоритму O(1). Це дає велику перевагу над switch, де кожен case порівнюється послідовно (складність алгоритму O(n)):

// match — O(1):
$color = match($code) {
    'R' => 'Red',
    'G' => 'Green',
    'B' => 'Blue',
    default => 'Unknown',
};

// switch — O(n):
switch ($code) {
    case 'R': $color = 'Red'; break;
    case 'G': $color = 'Green'; break;
    case 'B': $color = 'Blue'; break;
    default: $color = 'Unknown';
}

Висновки

match — це не альтернатива switch чи if/else, а окремий інструмент для ситуацій, де важлива чіткість та суворість, тобто для всіх ситуацій з умовами.

Він допомагає уникати класичних помилок зі switch і заохочує до чистішого, передбачуваного коду.

Він швидкий: прості значення шукаються у константний час.

Якщо ти ще не використовуєш match у повсякденній роботі, саме час спробувати його у своїй наступній задачі.

Як кажуть: "Відчуй різницю" 😉


Вперше опубліковано в Telegram-каналі «Створений щоб помирати» 21.06.2025.