docs: English JsonRpcBundle docs, REST and MCP Bundle sections, package cards
uk/articles/from-tg/php/match-vs-switch.md
новий файл +126
−0
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.