Чи може PHP бути функціональною мовою програмування?
Нещодавно згадав про бібліотеку мого колишнього тімліда і гарного товариша Slava Basko, яка дозволяє писати PHP-код у функціональному стилі. Власне, ця стаття — про мій досвід знайомства з нею, рефлексію та порівняння з підходами, які я використовую у своїй щоденній практиці.
Ті, хто мене знають, знають і про мою любов до ООП, архітектурної чистоти і чіткого контролю залежностей. Власне, я став таким не в останню чергу завдяки Славі — колись саме він відкрив мені світ ООП. Але минули роки, і Слава захопився мовою Haskell та загалом функціональним підходом у програмуванні. І от результат — він створив бібліотеку, яка переносить функціональний підхід в PHP-світ.
В чому сенс бібліотеки?
Бібліотека дозволяє:
- писати декларативний код, де немає проміжних змінних і імперативних конструкцій;
- використовувати каррінг, pipe, compose, partial тощо;
- створювати читабельні ланцюжки трансформацій без втрати контексту.
Приклад — зведення кількості товарів у масиві:
$totalQty = compose(sum, pluck('qty'))($products);
Інший приклад — форматування опису товарів:
$commonDescription = pipe(
pluck('description'),
map(unary('trim')),
select(unary('strlen')),
join(', '),
take(34),
partial_r('trim', ', ')
)($products);
Порівняння функціонального підходу з ООП та процедурним підходом
ПП — процедурний підхід, ООП — обʼєктно-орієнтований, ФП — функціональний.
| ПП | ООП | ФП | |
|---|---|---|---|
| Читабельність | Прямолінійна, але з купою змінних | Структуровано, але часто занадто обʼємно | Лаконічно, але може бути незвично |
| Повторне використання | Складно масштабувати | Абстракції, спадкування | Композиція, замикання |
| Тестування | Залежить від глобальних станів | Часто потребує моків | Простота завдяки чистим функціям |
| Гнучкість | Низька | Залежить від скіла розробника, середня або висока | Висока при трансформаціях |
| Контроль залежностей | Відсутній | Повний | Частково можливий, значно складніше відслідковувати, або я не розібрався |
| Коли це зручно? | Якщо обробляєш масиви або структури даних | Якщо маєш багато етапів трансформації | Якщо хочеш відмовитись від змінних і foreach |
Висновок
Це не звичний для більшості PHP-розробників підхід. Але він працює, зручний, і я точно буду використовувати його всередині методів класів, де потрібно швидко і чітко трансформувати дані. Чисті функції і pipe чудово лягають на обробку DTO, валідацію, генерацію описів тощо.
Рекомендую подивитись: slava-basko/functional-php.
Вперше опубліковано в Telegram-каналі «Створений щоб помирати» 20.06.2025.