Функции обратного вызова (callback-функции)
Callback-функции могут быть обозначены объявлением типа callable.
Некоторые функции, такие как call_user_func() или usort(), принимают определенные пользователем callback-функции в качестве параметра. Callback-функции могут быть как простыми функциями, так и методами объектов, включая статические методы классов.
Передача
В PHP функции передаются по имени в виде строки. Можно использовать любые встроенные, либо созданные пользователем функции, за исключением конструкций языка, таких как: array(), echo, empty(), eval(), exit(), isset(), list(), print или unset().
Метод созданного объекта (object) передается как массив, содержащий объект по индексу 0 и имя метода по индексу 1. Доступ к закрытым и защищенным методам разрешен изнутри класса.
Статические методы класса также могут быть вызваны без создания экземпляра
объекта класса путем передачи имени класса вместо объекта в элементе массива с
индексом 0 или выполнения 'ClassName::methodName'
.
Помимо обычных пользовательских функций, в качестве callback-функции можно передавать анонимные функции и стрелочные функции.
Как правило, любой объект, реализующий __invoke(), также может быть передан в параметр callback.
Пример #1 Пример callback-функции
<?php
// Пример callback-функции
function my_callback_function() {
echo 'Привет, мир!';
}
// Пример callback-метода
class MyClass {
static function myCallbackMethod() {
echo 'Привет, мир!';
}
}
// Тип 1: Простой callback
call_user_func('my_callback_function');
// Тип 2: Вызов статического метода класса
call_user_func(array('MyClass', 'myCallbackMethod'));
// Тип 3: Вызов метода класса
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Тип 4: Вызов статического метода класса
call_user_func('MyClass::myCallbackMethod');
// Тип 5: Вызов относительного статического метода
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A
// Тип 6: Объекты, реализующие __invoke, могут быть использованы как callback
class C {
public function __invoke($name) {
echo 'Привет ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
Пример #2 Пример callback-функции с использованием замыкания
<?php
// Наше замыкание
$double = function($a) {
return $a * 2;
};
// Диапазон чисел
$numbers = range(1, 5);
// Использование замыкания в качестве callback-функции
// для удвоения каждого элемента в нашем диапазоне
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
Результат выполнения данного примера:
2 4 6 8 10
Замечание:
Callback-функции, зарегистрированные такими функциями как call_user_func() и call_user_func_array(), не будут вызваны при наличии не пойманного исключения, брошенного в предыдущей callback-функции.