引用传递错误

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

【讨论】:

以上是关于引用传递错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到“仅应通过引用传递变量”错误?

java只有值传递

PHP 错误:“无法通过引用传递参数 2”

PHP对象到底是值传递还是引用传递

传递迭代器值而不是引用函数

值传递和引用传递的区别