
PHP call_user_func 函数调用类方法时,__call 方法失效的原因及解决方法
在 PHP 开发中,call_user_func 函数常用于动态调用函数或方法。然而,直接用它调用类的未定义方法时,__call 魔术方法可能不会被触发,本文将解释原因并提供解决方案。
问题:
尝试使用 call_user_func('Route', 'abc') 调用 Route 类中的 abc 方法时,__call 方法(假设已定义)未能被触发。这是因为 call_user_func 的第一个参数必须是可调用结构 (callable),而 'Route' 只是一个字符串,表示类名,而非可调用的对象实例。
立即学习“PHP免费学习笔记(深入)”;
call_user_func 期望的参数类型:
本程序版权归作者所有不得利用本程序从事任何非法活动!本程序功能有限只能满足基础型企业网站的建站需求,无法满足更搞要求的企业站,也无法利用本程序制作门户网站,更不能建站购物站。为了克服以上技术局限,我们开发了“新坐标CMS-超级云端网站管理系统”,可以满足任何要求的企业网站,也可以制作购物网站,同时还可以制作门户型网站。其标签式调用方法让您随心所欲调用想要的结果。 使用说明:根目录包含netbox无
- 函数名:例如
call_user_func('my_function'),其中my_function是已定义的函数。 - 对象方法:例如
call_user_func([$object, 'method']),$object是对象实例,method是其方法名。 - 静态方法:例如
call_user_func(['ClassName', 'staticMethod']),ClassName是类名,staticMethod是静态方法名。 - 闭包:例如
call_user_func(function(){...})
解决方案:
要正确调用 Route 类的 abc 方法并触发 __call 方法,需将第一个参数改为可调用结构,即包含对象实例和方法名的数组:
call_user_func([new Route(), 'abc'], '参数1', '参数2');
这样,call_user_func 才能正确识别并调用对象方法。如果方法不存在,则会调用 __call 方法进行处理。 通过传递一个包含对象实例和方法名的数组,call_user_func 正确地将方法调用委托给对象,从而触发 __call 方法。










