ti-enxame.com

Por que o erro "esperado para ser uma referência, com valor fornecido" aparece?

Ele dispara quando tento chamar a função com argumento por referência

function test(&$a) ...

através

call_user_func('test', $b);
29
yury-n

call_user_func pode somente passar parâmetros por valor, não por referência. Se você deseja passar por referência, precisa chamar a função diretamente ou usar call_user_func_array , que aceita referências (no entanto, isso pode não funcionar em PHP 5.3 e além, dependendo da parte do manual).

45
Daniel Vandersluis

Do manual para call_user_func ()

Observe que os parâmetros para call_user_func () não são passados ​​por referência.

Então sim, há sua resposta. No entanto, existe uma maneira de contornar isso, novamente lendo o manual

call_user_func_array('test', array(&$b));

Deve ser capaz de passar por referência.

19
Brad F Jacobs

Você precisa definir a variável igual ao resultado da função, assim ...

$b = call_user_func('test', $b);

e a função deve ser escrita da seguinte maneira ...

function test($a) {
    ...
    return $a
}

A outra passagem por trabalho de referência é preterida.

4
reubano

Acabei de ter o mesmo problema, alterando (no meu caso):

$result = call_user_func($this->_eventHandler[$handlerName][$i], $this, $event);

para

$result = call_user_func($this->_eventHandler[$handlerName][$i], &$this, &$event);

parece funcionar muito bem no php 5.3.

Acho que nem é uma solução alternativa, é apenas o que é dito :-)

4
rhalff

Você pode considerar o conceito de fechamento com uma variável de referência escondida na declaração "use". Por exemplo:

$note = 'before';
$cbl = function( $msg ) use ( &$note )
{
    echo "Inside callable with $note and $msg\n";
    $note = "$msg has been noted";
};
call_user_func( $cbl, 'after' );
echo "$note\n";

Uma solução alternativa para o seu problema original, mas se você tiver uma função que precise chamar por referência, poderá envolver um fechamento que pode ser chamado em torno dele e, em seguida, executá-lo por meio de call_user_func ().

0
Tel