2010-09-03 11 views

Respuesta

39

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).

+0

@Artefacto Lo dejé originalmente porque el manual indica que no es el caso en 5.3, pero he actualizado mi respuesta. –

+0

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. –

16

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.

+0

Sin embargo, esa solución solo funciona antes de PHP 5.3, según el manual. –

+0

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. –

+1

> 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

4

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

+0

método obsoleto. –

4

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.

Cuestiones relacionadas