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