callback функция

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

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

Метод созданного объекта передается как массив, содержащий сам объект в элементе с индексом 0 и имя метода в элементе с индексом 1.

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

Кроме общих пользовательских функций, create_function() также может быть использована для создания анонимной callback-функции. Начиная с версии PHP 5.3.0 стала возможным также передача замыканий в callback-параметр.

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

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

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

// Вариант 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: вызов статического метода класса (с версии PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

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

Пример #2 Пример callback-вызова с использованием замыканий

// наше замыкание
$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

Замечание: В PHP 4 было необходимо использовать ссылку при создании callback-функции для того, чтобы она указывала на реальный объект, а не на его копию. За подробностями обращайтесь к разделу Объяснение ссылок.

Замечание: Callback-функции, зарегистрированные такими функциями как call_user_func() и call_user_func_array(), не будут вызваны при наличии не пойманного исключения, брошенного в предыдущей callback-функции.



Смотрите также:
Описание на ru2.php.net
Описание на php.ru