PHP поддерживает перво-классные функции, это значит, что функция может быть применена к переменной. И определенные пользователем, и встроенные функции могут быть применены к переменной и вызываться динамически. Функции могут быть переданы, как аргумент к другой функции (эта особенность называется функцией высшего порядка), а так-же функция может возвращать другую функцию.
Рекурсия, особенность, которая позволяет функции вызывать саму себя, это поддерживается языком, но большая часть кода PHP фокусируется на итерации.
Новые анонимные функции(с поддержкой для замыканий) присутствую с PHP 5.3 (2009).
В PHP 5.4 добавлена возможность связывать замыкание с областью видимости объекта, а так-же улучшена поддержка callables(всё что может быть вызвано), так что они могут быть использованы наравне с анонимными функциями практически во всех случаях.
Наиболее распространным использованием функций высшего порядка, является реализация паттерна стратегия. Встроенная
функция array_filter
спрашивает одинаково, как входной массив(данные), так и функцию (стратегия или callback),
используемая, как фильтр для каждого элемента массива.
Замыкания - это анонимные функции, которые могут получить доступ к переменные, импортированным извне области видимости, без использования любых глобальных переменных. Теоретически, замыкание - функция с закрытыми некоторыми аргументами (например фиксированными) окружением, когда они объявлены. Замыкания могут обойти ограничения области видимости переменных, чистым способом.
В следующем примере, мы используем замыкания для объявления функции, возвращающей одну функцию фильтр для array_filter
из семьи фильтрирующих функций.
Каждая функция фильтр в семье, принимает только те элементы, значение которых больше, определенного минимального
значения. Одиночный фильтр возвращается с помощью замыкания criteria_greater_than
с аргументом $min
с закрытым значением в области видимости (даётся, как аргумент, когда criteria_greater_than
вызывается).
Ранее связывание, используется по умолчания, для импортирования переменной $min
для передачи переменной в созданную
функцию. Для настоящих замыканий с поздним связыванием обязательно следует использовать ссылку при импортировании.
Представьте себе библиотеки шаблонизации или валидации ввода, где замыкания объявлены для захвата переменных в
области видимости и доступа к ним позже, когда анонимные функции исполняются.