传递参考错误

时间:2010-03-21 11:01:34

标签: php arrays pass-by-reference hook

我有一个钩子系统设置...正在使用localhost ...我把它设置为运行并收到错误提示“警告:呼叫时间传递引用已被弃用”。

现在,显然,解决方法是删除所有“&”从函数调用,即foo(& $ me)到foo($ me),然后在foo的函数定义中执行“function foo(& $ me)”。

但是,我不能这样做...因为我的钩子接受一个数组作为参数,我需要解决这个问题。就像我可以使用“run_hooks('hook-name',$ me);”或“run_hooks('hook-name',array($ me,$ another_var等等))”;

所以这意味着我不能使用“函数run_hooks($ hook_name,& $ arguments)”,因为我在php中会收到错误,说它无法传递“array()”作为参考...

任何想法都可以解决?

感谢。

3 个答案:

答案 0 :(得分:2)

您想要使用引用以防止不必要的数据副本。但这不是你应该使用它们(在php5中)。只需传递数组。

function foo($x /* not a reference */) {
  echo $x['bar'], "\n";
} 
$p = array('bar'=>12345);
foo($p);
// or
foo( array('bar'=>12345) );

这不会调用作为参数传递的数组的深层副本 - 只要不更改数组即可。这种机制称为copy-on-write,php实现在http://www.research.ibm.com/trl/people/mich/pub/200901_popl2009phpsem.pdf

中进行了解释

答案 1 :(得分:1)

传递一系列引用 - 这个数组本身不需要是引用:

 function foo($args) {
    modify $args[0]...
    modify $args[1]...
 }

 $someVar = ...
 $anotherVar = ...

 foo(array(&$someVar, &$anotherVar));

答案 2 :(得分:0)

我认为我发现了一个可行的解决方法,没有错误,它确实可以在我的类中修改任何东西......可以帮助其他人...... ArrayObject解决了它,seince对象已经被“引用”了。

function test ( $var, $foo )
{
    $var    = 3;
    $foo    = 3;
}

$var    = 1;
$foo    = 1;
call_user_func_array ( 'test', new ArrayObject ( array ( &$var, &$foo ) ) );

print $foo;
print $var;

// Output is 3 3 like expected :)