match !== switch

← match !== switch

Ashterix

docs: English JsonRpcBundle docs, REST and MCP Bundle sections, package cards

uk/articles/from-tg/php/match-vs-switch.md новий файл +126 −0

1 + # match !== switch
2 +
3 + Вже відносно давно — починаючи з PHP 8.0 — зʼявився новий інструмент: `match`. Але практика співбесід (як джунів, так і мідлів) показує, що багато хто, в кращому випадку, просто знає про нього, але не використовує у повсякденному коді. Основна причина — поверхневе розуміння: існує думка, що це просто ще один синтаксичний цукор над `switch` чи `if/else`.
4 +
5 + Але це не так.
6 +
7 + Спробую пояснити, чому `match` — це окремий інструмент зі своїми перевагами і призначенням.
8 +
9 + ## 1. match повертає значення
10 +
11 + `match` — це вираз, а не інструкція. Він завжди повертає результат, який потрібно привласнити змінній:
12 +
13 + ```php
14 + $taxRate = match($countryCode) {
15 + 'UA' => 0.20,
16 + 'PL' => 0.23,
17 + 'DE' => 0.19,
18 + default => 0.0,
19 + };
20 + ```
21 +
22 + `switch` та `if/else`, на відміну від цього, нічого не повертають. Якщо ви хочете отримати результат — доводиться оголошувати змінну перед умовою, потім в кожному кейсі встановлювати їй значення.
23 +
24 + ## 2. Обовʼязкове покриття всіх кейсів
25 +
26 + `match` зобовʼязує розробника обробити всі можливі варіанти або вказати `default`. Якщо не вказано відповідність — буде `UnhandledMatchError`. Це значно знижує ризики неочевидних помилок.
27 +
28 + ```php
29 + $action = match($input) {
30 + 'start' => 'Запуск',
31 + 'stop' => 'Зупинка',
32 + default => 'Пауза',
33 + };
34 + ```
35 +
36 + У `switch` та `if/else` будь-який відсутній case просто проігнорується.
37 +
38 + ## 3. Завжди суворе порівняння (===), а не вільне (==)
39 +
40 + У `match` значення порівнюються суворо — без приведення типів. Це ще один реверанс PHP в бік суворої типізації і плюс до безпеки та передбачуваності:
41 +
42 + ```php
43 + match(0) {
44 + false => 'false', // ❌ UnhandledMatchError
45 + 0 => 'zero', // ✅ буде виконано
46 + };
47 +
48 + switch (0) {
49 + case false:
50 + echo 'false'; // ✅ буде виведено
51 + break;
52 + case 0:
53 + echo 'zero'; // ❌ сюди не дійде
54 + break;
55 + }
56 + ```
57 +
58 + `switch` у цьому випадку вибере `false` як відповідність до `0`, що може призвести до неочікуваної поведінки.
59 +
60 + ## 4. Немає fallthrough і break
61 +
62 + У `switch` завжди є ризик забути `break`, і тоді код "провалиться" в наступний кейс. Це класичне джерело помилок. У `match` кожен кейс — це окреме правило, і немає поняття `break` чи переходу до наступного.
63 +
64 + Хто не знає, про що мова, просто виконайте цей код:
65 +
66 + ```php
67 + $value = 2;
68 + switch ($value) {
69 + case 1:
70 + echo 'one';
71 + case 2:
72 + echo 'two';
73 + case 3:
74 + echo 'three';
75 + }
76 + ```
77 +
78 + ## 5. Виховує декларативність
79 +
80 + `match` заохочує до декларативного стилю — без зайвої логіки в тілі конструкції. Він не дозволяє писати довгі блоки коду в кожному кейсі, лише вирази. Це змушує структурувати код краще:
81 +
82 + ```php
83 + return match(true) {
84 + $x > 0 => 'позитивне',
85 + $x < 0 => 'негативне',
86 + default => 'нуль',
87 + };
88 + ```
89 +
90 + ## 6. Продуктивність: O(1) доступ по значенню
91 +
92 + `match` працює аналогічно хеш-мапі: якщо йдеться про скалярні значення (`int`, `float`, `string`, `bool`), він здійснює пошук у константний час — по [складності алгоритму O(1)](/articles/from-tg/series/algorithm-complexity/o-1). Це дає велику перевагу над `switch`, де кожен case порівнюється послідовно ([складність алгоритму O(n)](/articles/from-tg/series/algorithm-complexity/o-n)):
93 +
94 + ```php
95 + // match — O(1):
96 + $color = match($code) {
97 + 'R' => 'Red',
98 + 'G' => 'Green',
99 + 'B' => 'Blue',
100 + default => 'Unknown',
101 + };
102 +
103 + // switch — O(n):
104 + switch ($code) {
105 + case 'R': $color = 'Red'; break;
106 + case 'G': $color = 'Green'; break;
107 + case 'B': $color = 'Blue'; break;
108 + default: $color = 'Unknown';
109 + }
110 + ```
111 +
112 + ## Висновки
113 +
114 + > `match` — це не альтернатива `switch` чи `if/else`, а окремий інструмент для ситуацій, де важлива чіткість та суворість, тобто для всіх ситуацій з умовами.
115 + >
116 + > Він допомагає уникати класичних помилок зі `switch` і заохочує до чистішого, передбачуваного коду.
117 + >
118 + > Він швидкий: прості значення шукаються у константний час.
119 +
120 + Якщо ти ще не використовуєш `match` у повсякденній роботі, саме час спробувати його у своїй наступній задачі.
121 +
122 + Як кажуть: "Відчуй різницю" 😉
123 +
124 + ---
125 +
126 + *Вперше опубліковано в Telegram-каналі [«Створений щоб помирати»](https://t.me/php_while_true/27) 21.06.2025.*