PHP call_user_func为何无法触发__call方法?

php call_user_func为何无法触发__call方法?

深入剖析PHP call_user_func函数:为什么它无法触发__call方法?

本文将详细解释为什么call_user_func函数在调用未定义方法时,不会触发__call方法。

问题:使用call_user_func调用类的未定义方法时,预期的__call方法没有被触发。

示例代码:

立即学习PHP免费学习笔记(深入)”;

<?php
class Route {
    public function __call($name, $arguments) {
        echo 'aaa';
    }
}

$route = new Route();

// $route->abc();// 这段代码可以正确触发__call方法

call_user_func('Route', 'abc'); // 这段代码无法触发__call方法

?>
登录后复制

原因:call_user_func函数的第一个参数必须是可调用结构(callable),而’Route’只是一个字符串,表示类名,而不是可调用的对象实例。

解决方案:要正确使用call_user_func调用类的未定义方法并触发__call方法,第一个参数需要是一个可调用结构,例如包含对象实例和方法名的数组:

call_user_func([new Route(), 'abc']); // 或者包含参数 call_user_func([new Route(), 'abc'], '参数1', '参数2');
登录后复制

这段代码中,[new Route(), ‘abc’] 创建了一个数组,包含Route对象的实例和方法名’abc’,它表示调用该对象实例的abc方法。这样,call_user_func就能正确地调用方法,并在方法不存在时触发__call方法,输出’aaa’。

关键点:call_user_func需要明确的对象实例和方法名进行调用,而不是仅仅依靠类名。只有当第一个参数是可调用结构时,call_user_func才能正常工作并触发类的魔术方法。

以上就是PHP call_user_func为何无法触发__call方法?的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/1237431.html

发表回复

Your email address will not be published. Required fields are marked *