回调可以用可调用类型声明来表示。
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”))中指定回调时,如果从类内部调用,则该方法可以是私有的,但如果从外部调用,则会收到警告。