[PHP]回调函数参数(callable类型)的一些细节
$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!