Функции обратного вызова (callback-функции)

Callback-функции могут быть отмечены в коде подсказкой callable, появившейся в версии PHP 5.4. В этой документации для тех же целей используется callback.

Некоторые функции, такие как call_user_func() или usort(), принимают определенные пользователем callback-функции в качестве параметра. Callback-функции могут быть как простыми функциями, так и методами объектов, включая статические методы классов.

Передача

В PHP функции передаются по имени в виде строки. Можно использовать любые встроенные, либо созданные пользователем функции, за исключением конструкций языка, таких как: array(), echo, empty(), eval(), exit(), isset(), list(), print или unset().

Метод созданного объекта (object) передается как массив, содержащий объект по индексу 0 и имя метода по индексу 1. Доступ к приватным и защищенным методам разрешен изнутри класса.

Статические методы класса также могут быть вызваны без создания экземпляра объекта класса, путем передачи имени класса, вместо объекта, в элементе массива с индексом 0. С PHP 5.2.3, также можно передавать 'ClassName::methodName'.

Помимо обычных пользовательских функций, в качестве callback-функции, можно передавать анонимные функции.

Пример #1 Пример callback-функции

<?php

// Пример callback-функции
function my_callback_function() {
    echo 
'hello world!';
}

// Пример callback-метода
class MyClass {
    static function 
myCallbackMethod() {
        echo 
'Hello World!';
    }
}

// Type 1: Простой callback
call_user_func('my_callback_function');

// Type 2: Вызов статического метода класса
call_user_func(array('MyClass''myCallbackMethod'));

// Type 3: Вызов метода класса
$obj = new MyClass();
call_user_func(array($obj'myCallbackMethod'));

// Type 4: Вызов статического метода класса (С PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

// Type 5: Вызов относительного статического метода (С PHP 5.3.0)
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

// Type 6: Объекты реализующие __invoke могут быть использованы как callback (С PHP 5.3)
class {
    public function 
__invoke($name) {
        echo 
'Hello '$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-функции.