Чи може PHP бути функціональною мовою програмування?

← Чи може PHP бути функціональною мовою програмування?

Ashterix

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