PHP: call_user_func_array:传递引用问题

6
下面的函数在包含引用参数的函数时会生成错误,例如:
function test(&$arg, &$arg2)
{
  // some code
}

现在我不能使用call_user_func_array来调用上面的函数,否则会产生错误。

如何解决这个问题?

我确实需要使用call_user_func_array

同时假设我事先不知道它们是按引用传递还是按值传递。

谢谢。


4
您可以考虑取消接受当前回答,因为它实际上是错误的(更不用说滥用对象会完全改变问题的语义,给出错误建议)。以下是链接:http://codepad.viper-7.com/j3GOps - ircmaxell
2个回答

22

在将参数存储到数组中时,确保您存储的是对这些参数的引用,这样应该可以正常工作。

例如:

call_user_func_array("test", array(&param1, &param2));

2
但如果我事先不知道它们是按引用传递还是按值传递呢? - Sarfraz
1
然后想办法确定这一点,或者让它们全部通过引用传递,这是我的建议。恐怕你没有太多其他选择了。 - Myles
Myles:如果我不知道数组中参数的数量怎么办? - ymakux
@ymakux,最终你需要一个引用数组。你将会传递某些内容,所以只需从那个"某些内容"创建一个数组即可。 - Myles
是的,看起来在我的情况下call_user_func_array变得无用了,我不得不写意大利面式代码来代替它 switch(count($args)) { case 0: $class->{$method}(); break; case 1: } - ymakux

7

http://www.php.net/manual/de/function.call-user-func-array.php#91503上发布了一种很好的解决方法。

function executeHook($name, $type='hooks'){ 
    $args = func_get_args(); 
    array_shift($args); 
    array_shift($args); 
    //Rather stupid Hack for the call_user_func_array(); 
    $Args = array(); 
    foreach($args as $k => &$arg){ 
        $Args[$k] = &$arg; 
    } 
    //End Hack 
    $hooks = &$this->$type; 
    if(!isset($hooks[$name])) return false; 
    $hook = $hooks[$name]; 
    call_user_func_array($hook, $Args); 
} 

实际的黑客代码被注释包围。

1
谢谢你,救了我的命!这绝对是正确的答案。 - Mangiucugna
说得太早了...虽然这样可以消除错误,但它不会让我在可调用函数内部操作引用的变量。 - maryisdead
对于 PHP 5.6 及以上版本,使用 , &...$args 声明函数,然后像 $hook(...$args) 一样简单地调用钩子。 - mvorisek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接