Se dispara cuando trato de llamar a la función con el argumento por referencia¿Por qué aparece el error "se espera que sea una referencia, valor dado"?
function test(&$a) ...
través
call_user_func('test', $b);
Se dispara cuando trato de llamar a la función con el argumento por referencia¿Por qué aparece el error "se espera que sea una referencia, valor dado"?
function test(&$a) ...
través
call_user_func('test', $b);
call_user_func
puede sólo pasar parámetros por valor, no por referencia. Si desea pasar por referencia, debe llamar a la función directamente, o usar call_user_func_array
, que acepta referencias (sin embargo, esto puede no funcionar en PHP 5.3 y más allá, dependiendo de qué parte del manual se vea).
Desde el manual para call_user_func()
Tenga en cuenta que los parámetros para call_user_func() no se pasan por referencia.
Así que sí, ahí está su respuesta. Sin embargo, hay una manera alrededor de ella, de nuevo a través de la lectura de manual
call_user_func_array('test', array(&$b));
Debe ser capaz de pasar por referencia.
Sin embargo, esa solución solo funciona antes de PHP 5.3, según el manual. –
Sí, eso es cierto, por lo que probablemente sería mejor evitar el uso de ese método dado que no sería compatible con versiones anteriores. –
> Nota Esto no funcionará para PHP> 5.3.0, así que úselo con precaución. Sin embargo, lo intenté con PHP 5.3.3 y funcionó sin ninguna advertencia/avisos. Parece que call_user_func_array hide errors. – noxvile
acabo de tener el mismo problema, el cambio (en mi caso):
$result = call_user_func($this->_eventHandler[$handlerName][$i], $this, $event);
a
$result = call_user_func($this->_eventHandler[$handlerName][$i], &$this, &$event);
parece funcionar muy bien en PHP 5.3.
ni siquiera es una solución que pienso, que sólo está haciendo lo que se le dice :-)
método obsoleto. –
Es necesario establecer la variable igual al resultado de la función, al igual que ...
$b = call_user_func('test', $b);
y la función debe ser escrito de la siguiente manera ...
function test($a) {
...
return $a
}
el otro pase por la referencia de trabajo-a-rondas están en desuso.
@Artefacto Lo dejé originalmente porque el manual indica que no es el caso en 5.3, pero he actualizado mi respuesta. –
Lo llamaría directamente, ya que acabo de tener un caso en el que un script funciona bien en mi servidor con "call_user_func_array" pero para mi cliente arroja un error (estoy usando 5.3.x y debe serlo también) .. .so parece un poco de tacto y listo. –