← Назад к вопросам

Что такое функциональное программирование?

2.2 Middle🔥 91 комментариев
#PHP Core#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое функциональное программирование?

Функциональное программирование (ФП) — это парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании, избегая изменяемого состояния и мутаций данных. В отличие от императивного программирования, где программы описывают последовательность шагов для изменения состояния, ФП фокусируется на композиции чистых функций и неизменяемых данных.

Ключевые принципы функционального программирования

  1. Чистые функции (Pure Functions):

    • Функции, которые при одинаковых входных данных всегда возвращают одинаковый результат.
    • Не имеют побочных эффектов (не изменяют глобальные переменные, не выполняют I/O операции).
    • Пример в PHP:
    // Чистая функция
    function add(int $a, int $b): int {
        return $a + $b;
    }
    
    // Нечистая функция (имеет побочный эффект)
    $counter = 0;
    function increment() {
        global $counter;
        $counter++; // Изменяет внешнее состояние
    }
    
  2. Неизменяемость (Immutability):

    • Данные не изменяются после создания. Вместо изменения существующих структур создаются новые.
    • В PHP это достигается через создание новых объектов или массивов:
    // Изменяемый подход
    $array = [1, 2, 3];
    $array[] = 4; // Мутация исходного массива
    
    // Функциональный подход
    $original = [1, 2, 3];
    $new = array_merge($original, [4]); // Создаётся новый массив
    
  3. Функции первого класса и высшего порядка:

    • Функции могут передаваться как аргументы, возвращаться из других функций и присваиваться переменным.
    • Функции высшего порядка принимают или возвращают другие функции:
    // Функция высшего порядка
    function map(array $items, callable $func): array {
        $result = [];
        foreach ($items as $item) {
            $result[] = $func($item);
        }
        return $result;
    }
    
    $numbers = [1, 2, 3];
    $squared = map($numbers, function($n) {
        return $n * $n;
    });
    // $squared = [1, 4, 9]
    
  4. Рекурсия вместо циклов:

    • Вместо итеративных циклов (for, while) используются рекурсивные вызовы функций:
    // Рекурсивный факториал
    function factorial(int $n): int {
        if ($n <= 1) return 1;
        return $n * factorial($n - 1);
    }
    
  5. Каррирование и частичное применение:

    • Преобразование функции от нескольких аргументов в цепочку функций одного аргумента.
    • Частичное применение — создание новой функции с фиксацией некоторых аргументов:
    // Частичное применение
    function multiply($a, $b) {
        return $a * $b;
    }
    
    $double = function($x) use (&$multiply) {
        return multiply(2, $x);
    };
    
    // Или с использованием замыканий
    function partial($func, ...$args) {
        return function(...$moreArgs) use ($func, $args) {
            return $func(...array_merge($args, $moreArgs));
        };
    }
    
    $triple = partial('multiply', 3);
    echo $triple(5); // 15
    

Преимущества функционального программирования в PHP

  • Предсказуемость и надёжность: Чистые функции легче тестировать и отлаживать.
  • Безопасность многопоточности: Отсутствие изменяемого состояния упрощает параллельное выполнение.
  • Выразительность: Операции вроде array_map, array_filter и array_reduce делают код более декларативным.
  • Композируемость: Мелкие функции легко комбинируются в более сложные.

Ограничения и компромиссы

Хотя PHP не является чисто функциональным языком, элементы ФП активно используются:

  • Встроенные функции для работы с массивами (array_map, array_filter, array_reduce)
  • Анонимные функции и замыкания (с PHP 5.3)
  • Генераторы (с PHP 5.5)
  • Короткие замыкания (arrow functions с PHP 7.4)

Пример функционального стиля в PHP:

// Императивный подход
$numbers = [1, 2, 3, 4, 5];
$evenSquares = [];
foreach ($numbers as $number) {
    if ($number % 2 === 0) {
        $evenSquares[] = $number * $number;
    }
}

// Функциональный подход
$evenSquares = array_map(
    fn($n) => $n * $n,
    array_filter($numbers, fn($n) => $n % 2 === 0)
);

Вывод

Функциональное программирование в PHP — это не о полном отказе от ООП или императивного стиля, а о использовании правильных инструментов для конкретных задач. Комбинируя чистые функции, неизменяемые структуры и функции высшего порядка, можно создавать более модульный, тестируемый и поддерживаемый код, особенно при работе с преобразованиями данных, конвейерами обработки и асинхронными операциями.