引用传递错误
Posted
技术标签:
【中文标题】引用传递错误【英文标题】:Pass-by-Reference Error 【发布时间】:2011-01-30 00:24:43 【问题描述】:我有一个钩子系统设置...它正在本地主机上运行...我将其上线并收到错误消息“警告:不推荐使用调用时传递引用”。
现在,显然解决方法是从函数调用中删除所有“&”,即 foo(&$me) 到 foo($me),然后在 foo 的函数定义中执行“function foo(&$me)” .
但是,我不能这样做...因为我的钩子接受一个数组作为参数,我需要解决这个问题。就像我可以使用“run_hooks ('hook-name', $me);”或“run_hooks('hook-name', array ($me, $another_var, etc...))”;
所以这意味着我不能使用“function run_hooks ($hook_name, &$arguments)”,因为我会在 php 中得到一个错误,说它不能传递“array()”作为参考......
有什么想法可以解决吗?
谢谢。
【问题讨论】:
您不能在函数调用时指定 &,因为它是引用而不是指针。所以你必须将 & 移动到函数定义中。 如果它被用作foo( array(....) );
,为什么它首先应该是一个参考?
【参考方案1】:
我认为我找到了一个可行的解决方法,没有错误,并且它可以在不修改我的类中的任何内容的情况下工作......可以帮助其他人...... ArrayObject 解决了它,因为对象已经“引用”了。
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 :)
【讨论】:
见php.net/manual/en/…“这种形式的调用时通过引用传递不会发出弃用通知,但它仍然被弃用,很可能会在下一版本的PHP中被删除。” 【参考方案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中解释
【讨论】:
【参考方案3】:传递一个引用数组——这个数组本身不需要是一个引用:
function foo($args)
modify $args[0]...
modify $args[1]...
$someVar = ...
$anotherVar = ...
foo(array(&$someVar, &$anotherVar));
【讨论】:
以上是关于引用传递错误的主要内容,如果未能解决你的问题,请参考以下文章