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.*