Функціональне програмування на PHP

PHP підтримує функції першого класу, тобто функцію можна призначити змінній. Як визначені користувачем, так і на вбудовані функції можна посилатися за допомогою змінної та викликати їх динамічно. Функції можна передавати як аргументи інші функції, і функція може повертати інші функції (це функція називається функціями вищого порядку).

Рекурсія, функція, яка дозволяє функції викликати саму себе, підтримується мовою, але більшою частиною коду PHP акцент робиться на ітерації.

Анонімні функції (з підтримкою закриття) присутні з PHP 5.3 (2009).

У PHP 5.4 додано можливість прив’язувати замикання до області видимості об’єкта, а також покращено підтримку викликів, щоб вони можна використовувати як взаємозамінні з анонімними функціями майже у всіх випадках.

Найпоширенішим використанням функцій вищого порядку є реалізація шаблону стратегії. Вбудований array_filter() запитує як вхідний масив (дані), так і функцію (стратегію або зворотний виклик), яка використовується як функція фільтра на кожен елемент масиву.

<?php
$input = array(1, 2, 3, 4, 5, 6);

// Створює нову анонімну функцію та призначає її змінній
$filter_even = функція($item) {
    return ($item % 2) == 0;
};

// Вбудований array_filter приймає як дані, так і функцію
$output = array_filter($input, $filter_even);

// Функцію не потрібно призначати змінній. Це також справедливо:
$output = array_filter($input, function($item) {
    return ($item % 2) == 0;
});

print_r($вивід);

Закриття — це анонімна функція, яка може отримати доступ до змінних, імпортованих із зовнішньої області без використання глобальних змінні. Теоретично, замикання — це функція з деякими аргументами, закритими (наприклад, фіксованими) середовищем, коли вона визначено. Закриття можуть обійти обмеження змінної області видимості чистим способом.

У наступному прикладі ми використовуємо замикання, щоб визначити функцію, яка повертає одну функцію фільтра для array_filter(), out сімейства функцій фільтра.

<?php
/**
 * Створює функцію анонімного фільтра, яка приймає елементи > $min
 *
 * Повертає один фільтр із сімейства фільтрів «більше ніж n».
 */
функція критерій_більше_ніж($min)
{
    return function($item) use ($min) {
        повернути $item > $min;
    };
}

$input = array(1, 2, 3, 4, 5, 6);

// Використовувати array_filter для входу з вибраною функцією фільтра
$вихід = array_filter($вхід, критерій_більший_ніж(3));

print_r($вивід); // елементи > 3

Кожна функція фільтра в сімействі приймає лише елементи, що перевищують деяке мінімальне значення. Єдиний фільтр повернув criteria_greater_than — це замикання з аргументом $min, закритим значенням в області (надається як аргумент, коли criteria_greater_than називається).

Раннє зв’язування використовується за замовчуванням для імпорту змінної $min у створену функцію. Для справжнього закриття із запізненням binding під час імпортування слід використовувати посилання. Уявіть собі бібліотеку шаблонів або перевірки введення, де є закриття визначено для захоплення змінних у межах і доступу до них пізніше, коли анонімна функція оцінюється.