Обратные вызовы могут быть обозначены объявлением вызываемого типа.
Некоторые функции, такие как call_user_func() или usort(), принимают в качестве параметра определяемые пользователем функции обратного вызова. Функции обратного вызова могут быть не только простыми функциями, но и объектными методами, включая статические методы класса.
Прохождение
Функция PHP передается по имени в виде строки . Можно использовать любую встроенную или определяемую пользователем функцию, кроме языковых конструкций, таких как: array() , echo , empty() , eval() , exit() , isset() , list() , print или unset(). .
Метод созданного объекта передается в виде массива , содержащего объект с индексом 0 и имя метода с индексом 1. Разрешен доступ к защищенным и закрытым методам из класса.
Методы статического класса также можно передавать без создания экземпляра объекта этого класса либо путем передачи имени класса вместо объекта с индексом 0, либо путем передачи 'ClassName::methodName'
.
Помимо обычных определяемых пользователем функций, в параметр обратного вызова также могут быть переданы анонимные функции и функции со стрелками .
Примечание :
Начиная с PHP 8.1.0, анонимные функции также могут быть созданы с использованием синтаксиса callable первого класса .
Как правило, любой объект, реализующий __invoke() , также может быть передан в параметр обратного вызова.
Пример #1 Примеры функции обратного вызова
<?php
// An example callback function
function my_callback_function() {
echo 'hello world!';
}
// An example callback method
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// Type 1: Simple callback
call_user_func('my_callback_function');
// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod'));
// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Type 4: Static class method call
call_user_func('MyClass::myCallbackMethod');
// Type 5: Relative static class method call
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: Objects implementing __invoke can be used as callables
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
Пример #2 Пример обратного вызова с использованием замыкания
<?php
// Our closure
$double = function($a) {
return $a * 2;
};
// This is our range of numbers
$numbers = range(1, 5);
// Use the closure as a callback here to
// double the size of each element in our
// range
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
Приведенный выше пример выведет:
2 4 6 8 10
Примечание :
Обратные вызовы , зарегистрированные с помощью таких функций, как call_user_func() и call_user_func_array() , не будут вызываться, если в предыдущем обратном вызове возникло неперехваченное исключение.
0 комментариев