Функции обратного вызова (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-функции можно передавать анонимные функции и стрелочные функции.

Замечание:

Начиная с PHP 8.1.0, у 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, устарело, начиная с PHP 8.2.0

// Тип 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-функции.