[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!
分类:
PHP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix