1.可调用(callable)类型声明
回调函数可以通过 可调用(callable)类型 声明来表示。
//$callback为回调函数,...$args为传递给回调函数的参数
//返回值为回调函数的返回值
call_user_func(callable $callback, mixed ...$args): mixed
2.回调函数
回调函数可以是普通函数、静态方法、实例方法、匿名函数、箭头函数、任何实现了 __invoke()
的类的对象。
//普通函数示例
function my_callback_function()
{
echo 'hello world!';
}
//静态方法示例
class MyClass {
static function myCallbackMethod()
{
echo 'Hello World!';
}
}
//任何实现了__invoke()的类示例
class C
{
public function __invoke($name)
{
echo 'Hello ', $name, "\n";
}
}
3.传递回调函数
回调函数是以字符串类型的函数名称被传递的。
静态方法被作为数组传递,数组的索引0的值为该类,索引1的值为该静态方法。或者传递 'ClassName::methodName'
。
实例方法被作为数组传递,数组的索引0的值为该对象,索引1的值为该实例方法。
//普通函数作为回调函数被传递
call_user_func('my_callback_function');
//静态方法以数组形式作为回调函数被传递
call_user_func(array('MyClass', 'myCallbackMethod'));
//静态方法以双冒号形式作为回调函数被传递
call_user_func('MyClass::myCallbackMethod');
//父级静态方法作为回调函数被传递
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
//实例方法作为回调函数被传递
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
//匿名函数作为回调函数被传递
$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
//任何实现了__invoke()的类的对象作为回调函数被传递
//实际上传递的是特殊的实例方法__invoke()
class C
{
public function __invoke($name)
{
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
//输出
Hello PHP!
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/10085.html