Функции обратного вызова (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 {
    public static function 
who() {
        echo 
"A\n";
    }
}

class 
extends {
    public static function 
who() {
        echo 
"B\n";
    }
}

call_user_func(array('B''parent::who')); // A

// Тип 6: Объекты, реализующие __invoke, могут быть использованы как callback
class {
    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(15);

// Использование замыкания в качестве 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-функции.