2.8PHP类型之可调用(Callable)

可调用(callable)类型表示回调函数。

1.回调函数声明

回调函数声明无需特殊的语法。

回调函数支持 普通函数、匿名函数、箭头函数、静态方法、实例方法、任何实现了 __invoke() 方法的类的对象。

2.传递回调函数

//第一个参数为回调函数
//第二个参数为传递给回调函数的0个或多个参数
//返回值为回调函数的返回值
call_user_func(callable $callback, mixed ...$args): mixed
传递方式语法
字符串''
数组array()[]
变量$变量名
回调函数传递方式(注意:函数名或方法名后无圆括号)
普通函数call_user_func('函数名')
call_user_func($变量名)
匿名函数call_user_func(function (形参) { 函数体 })
call_user_func($变量名)
箭头函数call_user_func(fn (形参) => 表达式)
call_user_func($变量名)
静态方法call_user_func('类名::静态方法名')
call_user_func(array('类名', '静态方法名'))
call_user_func(array($对象名, '静态方法名'))
call_user_func($变量名)
实例方法call_user_func('$对象名->实例方法名')(不支持此语法)
call_user_func(array($对象名, '实例方法名'))
call_user_func($变量名)
任何实现了 __invoke() 方法的类的对象call_user_func($对象名)
//普通函数作为回调函数
function my_callback_function() {
    echo 'hello world!';
}

call_user_func('my_callback_function');
//匿名函数和箭头函数作为回调函数

$numbers = range(1, 5);

$new_numbers1 = array_map(function($a) { return $a * 2; }, $numbers);
$new_numbers2 = array_map(fn($a) => $a*2, $numbers);

print implode(' ', $new_numbers1);
print implode(' ', $new_numbers2);

//输出
2 4 6 8 10
2 4 6 8 10
class MyClass {
    //静态方法
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
    //实例方法
    function myCallbackMethod2() {
        echo 'Hello World!2';
    }
    
    //__invoke()方法
    public function __invoke($name) {
        echo 'Hello ', $name, "\n";
    }
}


//静态方法作为回调函数(字符串方式)
call_user_func('MyClass::myCallbackMethod');

//静态方法作为回调函数(array()类方式)
call_user_func(array('MyClass', 'myCallbackMethod'));

//静态方法作为回调函数(array()对象方式)
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

//实例方法作为回调函数
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod2'));

//实现了__invoke()方法的类的对象作为回调函数
$obj = new MyClass();
call_user_func($obj, 'PHP!');

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/28899.html

(0)
上一篇 2023年7月7日
下一篇 2023年7月9日

相关推荐

  • 2.7PHP类型之枚举(Enum)

    枚举(Enum)本质上也是一个类。 枚举体可以包含常量、静态方法、实例方法、魔术方法(仅支持 __call()、__callStatic()、__invoke()),不可以有 静态属性、实例属性、构造函数、析构函数。 枚举是隐式的 final 类,不可以继承。 枚举不可以像类一样直接使用 new 实例化,条目(case…

    PHP语言教程 2023年7月7日
    0210
  • 2.5PHP类型之接口(Interface)

    1.接口声明 接口体中可以包含静态方法、实例方法、构造函数(不推荐)、析构函数(不推荐)、魔术方法、类常量。 接口中的所有方法只可以定义方法签名,不可以定义方法的具体实现。 接口可以继承,但不可以实例化。 注意:接口中的所有方法与抽象方法的语法不同,接口中的所有方法不可以添加 abstract 关键字。 注意:接口中的…

    PHP语言教程 2023年7月5日
    0240
  • 2.10PHP语言的特性(Attribute)类

    1.特性(Attribute)类声明 声明一个特性类,首先从全局命名空间 use 导入 #[Attribute] 特性,然后在普通类声明上添加 #[Attribute] 特性以表示此类为特性类。 特性目标 描述 Attribute::TARGET_ALL 不限制用于具体哪一个。 Attribute::TARGET_CL…

    PHP语言教程 2023年7月10日
    0210

发表回复

登录后才能评论