【问题标题】:PHP: call_user_func_array: pass by reference issuePHP:call_user_func_array:按引用传递问题
【发布时间】:2009-12-15 07:44:37
【问题描述】:

当函数包含引用的参数时,以下函数会产生错误,例如:

function test(&$arg, &$arg2)
{
  // some code
}

现在我不能将call_user_func_array用于上述功能,它会产生错误。

如何解决这个问题?

我确实需要使用call_user_func_array

还假设我事先不知道它们是通过引用传递还是通过值传递。

谢谢

【问题讨论】:

  • 不接受当前的答案是值得的,因为它确实是错误的(更不用说通过滥用完全改变问题语义的对象来提供不好的建议):codepad.viper-7.com/j3GOps

标签: php function-calls


【解决方案1】:

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

即:

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

【讨论】:

  • 但是如果我事先不知道它们是通过引用传递还是通过值传递呢?
  • 然后找出一种方法来确定,或者让它们全部通过引用将是我的建议。恐怕你无能为力。
  • Myles:如果我不知道数组中的参数数量怎么办?
  • @ymakux 最终你需要一个引用数组。您将传递 something,因此只需从该内容创建一个数组即可。
  • 是的,对,似乎 call_user_func_array 在我的情况下变得无用,我必须编写意大利面条代码而不是这个 switch(count($args)) { case 0: $class->{$method}( );休息;案例一:}
【解决方案2】:

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); 
} 

实际的 hack 被 cmets 包围。

【讨论】:

  • 谢谢你,救了我的命!这绝对是正确答案
  • 说得太早了……虽然这消除了错误,但它不会让我在可调用对象中操作引用的变量。
  • 对于 PHP 5.6 及以上版本,使用 , &...$args 声明函数,然后像 $hook(...$args) 一样简单地调用钩子。
猜你喜欢
  • 2012-03-17
  • 2019-01-20
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2011-05-08
  • 2013-04-12
  • 2012-01-16
相关资源
最近更新 更多