【问题标题】: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(....) );,为什么它首先应该是一个参考?

标签: php arrays pass-by-reference hook


【解决方案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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 2014-08-18
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多