Callback-функции в PHP
Узнайте, что такое callback-функции в PHP, зачем они нужны и как их использовать с array_map, array_filter, usort и методами объектов.
Callback (или «callable») — это функция, которую вы передаёте в другую функцию, чтобы та вызвала её позже. Callbacks являются основой функций высшего порядка в PHP — array_map, usort, array_filter и множество хуков фреймворков принимают callback в качестве аргумента. В этой главе объясняется, что считается callable в PHP, рассматриваются четыре способа написания callback-функций и их применение в повседневном коде.
Предполагается, что вы уже знакомы с базовыми функциями PHP. Если вы новичок в определении функций, сначала прочитайте эту главу.
Что такое callback-функции в PHP?
Callback-функция в PHP — это любая функция, передаваемая в качестве аргумента другой функции и вызываемая внутри неё. PHP распознаёт значение как callable в четырёх формах:
- Строка с именем функции —
'strtoupper'ссылается на встроенную функциюstrtoupper(). - Анонимная функция (замыкание) —
function () { ... }, присвоенная переменной или переданная напрямую. - Стрелочная функция —
fn() => ..., сокращённый синтаксис для коротких замыканий (PHP 7.4+). - Ссылка на объект/метод —
[$object, 'methodName']или['ClassName', 'staticMethod'].
Тип параметра, принимающего любой из этих вариантов, — callable. Вы можете вызвать значение напрямую ($callback()) или через call_user_func() / call_user_func_array(), когда нужно передать динамический список аргументов.
Зачем использовать callback-функции в PHP?
Callbacks позволяют написать функцию один раз и настраивать её поведение при каждом вызове, не переписывая её:
- Повторное использование кода. Обобщённая функция (например, «пройтись по списку и сделать что-то с каждым элементом») подходит для любой задачи, переданной в качестве callback.
- Более чистая логика. Встроенные функции высшего порядка, такие как
array_mapиarray_filter, заменяют ручные циклы одной декларативной строкой. - Разделение ответственности. Событийный код — обработчики форм, процессоры CLI-команд, хуки фреймворков — регистрирует callback, который срабатывает только при наступлении события, разделяя триггер и обработчик.
Как использовать callback-функции в PHP
Использовать callback-функции в PHP просто. Вы передаёте имя функции или анонимную функцию в качестве аргумента родительской функции. Вот пример использования именованной функции в качестве callback:
Пример PHP: использование именованной функции в качестве callback
В приведённом примере myCallbackFunction передаётся как аргумент в parentFunction. При выполнении parentFunction она вызывает call_user_func и передаёт myCallbackFunction как аргумент. В результате myCallbackFunction выполняется и выводит сообщение "The callback function has been executed."
Вот пример использования анонимной функции в качестве callback:
Пример PHP: использование анонимной функции в качестве callback
В этом примере анонимная функция присваивается переменной $myCallbackFunction. Затем эта переменная может быть передана как аргумент в parentFunction — точно так же, как именованная функция в предыдущем примере.
Начиная с PHP 7.4, для простых callbacks также можно использовать лаконичный синтаксис стрелочных функций (fn). Стрелочные функции автоматически захватывают переменные из родительской области видимости и обеспечивают более чистый синтаксис для коротких callbacks:
$myCallback = fn() => print("The arrow callback function has been executed.");
parentFunction($myCallback);Передача аргументов в callback
Большинство полезных callbacks получают данные. Родительская функция определяет, какие аргументы передавать при вызове callback. Используйте call_user_func() для позиционной передачи аргументов или call_user_func_array() для передачи массива аргументов:
<?php
function applyToPair(callable $callback, int $a, int $b) {
return call_user_func($callback, $a, $b);
}
$add = fn(int $x, int $y) => $x + $y;
$multiply = fn(int $x, int $y) => $x * $y;
echo applyToPair($add, 4, 6); // 10
echo "\n";
echo applyToPair($multiply, 4, 6); // 24Здесь applyToPair не знает, выполняется ли сложение или умножение — это решение находится в передаваемом callback.
Использование callbacks со встроенными функциями
Чаще всего callbacks используются с функциями для работы с массивами в PHP. Они принимают callback и применяют его к каждому элементу списка, заменяя написанные вручную циклы.
<?php
$numbers = [1, 2, 3, 4, 5];
// array_map: transform every element
$squares = array_map(fn($n) => $n * $n, $numbers);
echo implode(', ', $squares); // 1, 4, 9, 16, 25
echo "\n";
// array_filter: keep elements where the callback returns true
$evens = array_filter($numbers, fn($n) => $n % 2 === 0);
echo implode(', ', $evens); // 2, 4
echo "\n";
// usort: sort using a comparison callback (descending order)
$values = [3, 1, 4, 1, 5];
usort($values, fn($a, $b) => $b <=> $a);
echo implode(', ', $values); // 5, 4, 3, 1, 1Подробнее о сортировке читайте в разделе Сортировка массивов в PHP.
Использование методов объектов в качестве callbacks
Callback также может указывать на метод. Передайте [$object, 'methodName'] для метода экземпляра или ['ClassName', 'staticMethod'] для статического:
<?php
class Greeter {
public function greet(string $name): string {
return "Hello, {$name}!";
}
public static function shout(string $name): string {
return strtoupper("Hi {$name}");
}
}
$greeter = new Greeter();
// Instance method as a callback
echo call_user_func([$greeter, 'greet'], 'Ada'); // Hello, Ada!
echo "\n";
// Static method as a callback
echo call_user_func(['Greeter', 'shout'], 'Ada'); // HI ADAСовет: Начиная с PHP 8.1, можно использовать синтаксис callable первого класса —
$greeter->greet(...)илиstrtoupper(...)— чтобы получитьClosureиз любого callable без использования строк, что безопаснее и удобнее для IDE.
Заключение
Callback-функции в PHP — это мощный инструмент программирования. Они обеспечивают повторное использование кода, упрощают сложную логику и позволяют реализовывать событийное программирование на стороне сервера. Понимание callback-функций в PHP поможет вам вывести свои навыки PHP на новый уровень.