← Чи може PHP бути функціональною мовою програмування?
docs: English JsonRpcBundle docs, REST and MCP Bundle sections, package cards
uk/articles/from-tg/php/functional-php.md
новий файл +56
−0
1
+
# Чи може PHP бути функціональною мовою програмування?
2
+
3
+
Нещодавно згадав про [бібліотеку](https://packagist.org/packages/slava-basko/functional-php) мого колишнього тімліда і гарного товариша Slava Basko, яка дозволяє писати PHP-код у функціональному стилі. Власне, ця стаття — про мій досвід знайомства з нею, рефлексію та порівняння з підходами, які я використовую у своїй щоденній практиці.
4
+
5
+
Ті, хто мене знають, знають і про мою любов до ООП, архітектурної чистоти і чіткого контролю залежностей. Власне, я став таким не в останню чергу завдяки Славі — колись саме він відкрив мені світ ООП. Але минули роки, і Слава захопився мовою Haskell та загалом функціональним підходом у програмуванні. І от результат — він створив бібліотеку, яка переносить функціональний підхід в PHP-світ.
6
+
7
+
## В чому сенс бібліотеки?
8
+
9
+
Бібліотека дозволяє:
10
+
11
+
- писати декларативний код, де немає проміжних змінних і імперативних конструкцій;
12
+
- використовувати каррінг, pipe, compose, partial тощо;
13
+
- створювати читабельні ланцюжки трансформацій без втрати контексту.
14
+
15
+
Приклад — зведення кількості товарів у масиві:
16
+
17
+
```php
18
+
$totalQty = compose(sum, pluck('qty'))($products);
19
+
```
20
+
21
+
Інший приклад — форматування опису товарів:
22
+
23
+
```php
24
+
$commonDescription = pipe(
25
+
pluck('description'),
26
+
map(unary('trim')),
27
+
select(unary('strlen')),
28
+
join(', '),
29
+
take(34),
30
+
partial_r('trim', ', ')
31
+
)($products);
32
+
```
33
+
34
+
## Порівняння функціонального підходу з ООП та процедурним підходом
35
+
36
+
ПП — процедурний підхід, ООП — обʼєктно-орієнтований, ФП — функціональний.
37
+
38
+
| | ПП | ООП | ФП |
39
+
| --- | --- | --- | --- |
40
+
| **Читабельність** | Прямолінійна, але з купою змінних | Структуровано, але часто занадто обʼємно | Лаконічно, але може бути незвично |
41
+
| **Повторне використання** | Складно масштабувати | Абстракції, спадкування | Композиція, замикання |
42
+
| **Тестування** | Залежить від глобальних станів | Часто потребує моків | Простота завдяки чистим функціям |
43
+
| **Гнучкість** | Низька | Залежить від скіла розробника, середня або висока | Висока при трансформаціях |
44
+
| **Контроль залежностей** | Відсутній | Повний | Частково можливий, значно складніше відслідковувати, або я не розібрався |
45
+
| **Коли це зручно?** | Якщо обробляєш масиви або структури даних | Якщо маєш багато етапів трансформації | Якщо хочеш відмовитись від змінних і foreach |
46
+
47
+
## Висновок
48
+
49
+
> Це не звичний для більшості PHP-розробників підхід. Але він працює, зручний, і я точно буду використовувати його всередині методів класів, де потрібно швидко і чітко трансформувати дані.
50
+
> Чисті функції і pipe чудово лягають на обробку DTO, валідацію, генерацію описів тощо.
51
+
52
+
Рекомендую подивитись: [slava-basko/functional-php](https://packagist.org/packages/slava-basko/functional-php).
53
+
54
+
---
55
+
56
+
*Вперше опубліковано в Telegram-каналі [«Створений щоб помирати»](https://t.me/php_while_true/20) 20.06.2025.*