2010-03-21 98 views
0

我有一个钩子系统安装程序......它在localhost上工作......我把它放到网上,并得到一个错误,提示“警告:呼叫时传递引用已被弃用” 。传递引用错误

现在,很明显的解决办法是从你的函数调用,删除所有“&”例如,foo(& $我)到foo($我),然后在Foo的函数定义做“函数foo(& $我) ”。

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

因此,这意味着我不能用“的功能run_hooks($ hook_name,& $参数)”因为我会在PHP错误说,它不能通过“阵列()”作为参考......

任何想法一个工作?

谢谢。

+0

您不能在functnion调用中指定&,因为它的引用不是指针。所以你必须移动并进入函数定义。 – zerkms 2010-03-21 11:04:15

+1

为什么它应该是一个引用,如果它被用作'foo(array(....));'无论如何? – VolkerK 2010-03-21 11:05:44

回答

1

传递引用数组左右 - 这阵本身并不需要给大家做个参考:

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

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

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

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

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

这不会调用作为参数传递的数组的深层副本 - 只要您不更改数组。这种机制被称为写入时复制和PHP实现在http://www.research.ibm.com/trl/people/mich/pub/200901_popl2009phpsem.pdf

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 :) 
+0

看到我的答案是正确的做法。 – user187291 2010-03-21 12:21:00

+0

参见http://php.net/manual/en/function.call-user-func-array.php#refsect1-function.call-user-func-array-notes“这种形式的呼叫时间通过参考传递不会发出弃用通知,但它仍然被弃用,并且很可能会在下一版本的PHP中被删除。“ – user102008 2011-09-01 23:06:19