[PHP]回调函数参数(callable类型)的一些细节

发布时间 2023-04-18 14:55:26作者: yiyide266
$foo = function(){
    echo "foo()\n";
};
$foo();
call_user_func($foo);

以上两种调用callable类型的语法是无问题的,函数可以正常运行

下面来说一下习惯上认为可行,但事实上不可行的两个调用方法
假设有以下代码,A实例的foo属性为一个callable:

class A{
    public $foo;
    public function bar(){
        echo "bar()\n";
    }
}
$t = new A();
$t->foo = function(){
    echo "foo()\n";
};

对对象调用方法的语法对callable类型无效,因为这个语法已经被php仅用于调用方法来解析,如果执行,php会提示:"Call to undefined method":

$t->foo(); //提示:"Call to undefined method"

调用call_user_func函数,第一个参数是callable有效:

call_user_func($t->foo); //正常调用

调用call_user_func函数,但使用重新指定上下文的形式无效,因为这种语法规定参数array的第二项是一个方法(或函数)名,而不是一个callable:

call_user_func(array($t, $t->foo)); //提示:"second array member is not a valid method"

想要实现重新定位上下文,只需要借助一下Closure :: bind()方法,它接受一个callable,重新返回一个指定了新的上下文的callable,然后再次用call_user_func函数普通的调用方式,就没问题:

call_user_func(Closure :: bind($t->foo, $t)); //Okay!