回调可以用可调用类型声明来表示。
call_user_某些函数,如func()或usort(),可以接受用户定义的回调函数作为参数。回调函数不仅是简单的函数,也是包含静态类方法的对象的方法。
合格,合格
PHP将函数作为字符串传递。您可以使用任何内置或用户定义的函数,除了语言结构,如array()、echo、empty()、eval()、exit()、isset()、list()、print或unset()。
实例化对象的方法作为数组传递,该数组具有包含对象的索引0和包含方法名称的索引1。可以在同一类中访问保护方法和专用方法。
可以传递静态类方法而不实例化对象。在0中,代替对象传递类名,或传递“ClassName::methodName”。
回调参数不仅可以使用普通的用户定义函数,还可以接受无名函数和阿罗函数。
提示:
在PHP8.1.0中,还可以使用First-class callable语法创建匿名函数。
通常,__实现invoke()的对象可以传递回调参数。
示例1回调函数示例:
<?php
// 回调函数示范
function my_callback_function() {
echo 'hello world!';
}
// 回调方法示范
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// 类型 1:简单的回调
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 A {
public static function who() {
echo "A
";
}
}
class B extends A {
public static function who() {
echo "B
";
}
}
call_user_func(array('B', 'parent::who')); // A
// 类型 6:实现 __invoke 的对象用于回调
class C {
public function __invoke($name) {
echo 'Hello ', $name, "
";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
使用实例#2存储模块的示例:
<?php
// 闭包
$double = function($a) {
return $a * 2;
};
// 这是数字范围
$numbers = range(1, 5);
// 这里使用闭包作为回调,
// 将范围内的每个元素数值翻倍
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>输出以上例程:
2 4 6 8 10
注意:
如果在函数中注册了多个回调内容(call_user_func()或call_user_func_使用array()等),如果在以前的回调中有未捕获的异常,则以后的回调将不再被调用。
性能说明:如果值看起来像静态方法回调,则可调用类型提示(如is_callable())将触发类的自动加载。
在数组表示法(即数组($this,“myfunc”))中指定回调时,如果从类内部调用,则该方法可以是私有的,但如果从外部调用,则会收到警告。