2.9PHP类型之可调用(Callable)

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

(0)
上一篇 2021年2月8日 20:39
下一篇 2021年2月9日 20:05

相关推荐

  • 2.12PHP语言的成员访问控制(Visibility)

    属性、常量、方法等成员的访问控制是通过在前面添加关键字 public(公有)、protected(受保护)或 private(私有) 来实现的。 如果没有为属性、常量、方法等成员添加访问修饰符,则默认可见性为 public。 被定义为 public的类成员可以在任何地方被访问。 被定义为 protected的…

    PHP语言教程 2021年2月12日
    08310
  • 1.9PHP语言的语句(Statement)

    1.declare语句 declare 结构通过设定指令(directive)以用来控制语句块(statement)的行为。 1.1ticks指令 目前,只支持 ticks、encoding、strict_types 这三个指令。 Tick 是一个在 declare 中的语句块(state…

    PHP语言教程 2021年1月9日
    0290
  • 1.10PHP语言的条件(Conditional)、循环(Loop)、跳转(Jump)语句

    1.if条件 2.if-else条件 3.if-elseif-else条件 4.switch-case条件 switch 语句的用途:很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。switch 语句一行接一行地执行(实际上是语句接语句)。开始时没有代码…

    PHP语言教程 2021年1月10日
    08460

发表回复

登录后才能评论