Ошибка передачи по ссылке - PullRequest
0 голосов
/ 21 марта 2010

У меня есть настройка системы перехвата ... которая работает на локальном хосте ... Я включил ее и получаю сообщение об ошибке «Предупреждение: передача по времени вызова устарела».

Теперь, по-видимому, обходной путь состоит в том, чтобы удалить все "&" из вызовов функций, то есть от foo (& $ me) до foo ($ me), а затем в определении функции foo сделать "function foo (& $ me)" .

Однако я не могу этого сделать ... потому что мои хуки принимают массив в качестве аргументов, мне нужно обойти это. Как я могу использовать "run_hooks ('hook-name', $ me);" или "run_hooks ('hook-name', массив ($ me, $ another_var и т. д.))";

Таким образом, это означает, что я не могу использовать "функцию run_hooks ($ hook_name, & $ arguments)", потому что я получу ошибку в php, сказав, что она не может передать "array ()" в качестве ссылки ...

Есть идеи, как обойтись?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 21 марта 2010

I думаю вы хотите использовать ссылку для предотвращения ненужных копий данных. Но это не то, для чего вы должны их использовать (в 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

1 голос
/ 21 марта 2010

Передайте массив ссылок вокруг - сам этот массив не должен быть ссылкой:

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

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

 foo(array(&$someVar, &$anotherVar));
0 голосов
/ 21 марта 2010

Я думаю, что нашел жизнеспособный обходной путь, без ошибок, и он работает без изменения чего-либо в моих классах ... может помочь кому-то еще ... 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 :)
...