🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
示例:当尝试以调用函数的方式调用一个**对象**时,该**方法**会被自动调用 ``` class invoke { public function __invoke($x) { var_dump($x); } } $obj = new invoke; $obj(10); /* 输出: int 10 ``` 实例化对象本身是不能被调用,但是类中如果实现 __invoke() , 则把实例对象当作方法调用,会自动调用到 __invoke() 方法,参数顺序相同 当尝试以调用**函数**的方式调用一个**对象**时,__invoke() 方法会被自动调用。 **symfony 巧用** ``` class Test { static public function demo($a, $b) { echo $a + $b; } public function show($a, $b) { echo $a + $b; } public function __invoke(...$a){ var_dump($a); } } call_user_func_array(new Test(),[1,2]); // 走__invoke //其他使用 call_user_func_array([new Test(),'demo'],[1,2]); // 3 call_user_func_array('Test::demo', [1, 2]); // 3 call_user_func_array(['Test', 'demo'], [1, 2]); // 3 ``` ## **解释call_user_func_array(new Test(),[1,2]);,为啥走__invoke** 在 PHP 中,当一个对象被作为函数调用时,会自动触发该对象的`__invoke()`方法。`__invoke()`方法是一个魔术方法,用于将对象作为可调用实体使用。 在你的示例中,当你调用`call_user_func_array(new Test(), [1, 2])`时,`new Test()`创建了一个`Test`类的对象,并将其作为可调用对象传递给`call_user_func_array()`函数。由于该对象被作为函数调用,PHP 会自动查找并触发该对象的`__invoke()`方法。 因此,`__invoke()`方法会被调用,并接收`[1, 2]`作为参数。在你的示例中,`__invoke()`方法使用`var_dump()`函数打印了参数数组`$a`的内容。 通过定义`__invoke()`方法,你可以使一个对象可以像函数一样被调用。这在某些情况下可以提供更灵活的代码结构和使用方式。