2008-11-17 21 views

Respuesta

45

Para pasar por referencia usando call_user_func_array(), el parámetro de la matriz debe ser una referencia - que no depende de la definición de función si es o no se pasa por referencia. Por ejemplo, esto funcionaría:

function toBeCalled(&$parameter) { 
    //...Do Something... 
} 

$changingVar = 'passThis'; 
$parameters = array(&$changingVar); 
call_user_func_array('toBeCalled', $parameters); 

Ver las notas en el call_user_func_array() function documentation para más información.

+7

Esta solución lanza advertencia con estricto está activado ... "Deprecated: Llame a tiempo el paso por referencia ya no se utiliza en" – Archenoth

+3

no sé acerca de la versión más reciente de PHP, pero en mi servidor 5.3.3 cuando utilicé 'call_user_func (" function ", & $ parameter)' recibí el mensaje Deprecated. Cuando cambié a 'call_user_func_array' solucionó el problema. Entonces verifiqué con STRICT habilitado y todavía no recibí el mensaje, así que creo que esta es una forma aceptable de hacerlo. – Lightbulb1

-2

Excepto que está utilizando la funcionalidad en desuso aquí. Generará una advertencia en PHP5 por lo que es menos que perfecto.

Advertencia: el tiempo de referencia de la llamada por referencia ha quedado obsoleto; Si desea pasarlo por referencia, modifique la declaración del nombre de la función de tiempo de ejecución. Si desea activar la llamada en tiempo pasar por referencia, se puede establecer allow_call_time_pass_reference en true en el archivo INI en ...

Por desgracia, no parece haber ninguna otra opción en cuanto a Puedo descubrir

+6

Solo traté de hacer esto con PHP 5.2.9 y no recibí ninguna advertencia.Creo que podría estar confundido por el hecho de que array() no es realmente una función; lo que estoy haciendo en mi ejemplo de código es básicamente establecer '$ parameters [0] = & $ changingVar'. Por lo tanto, no se trata de una referencia de paso por referencia; la referencia por paso se especifica en la firma del método. –

+1

Eso solo se aplica a llamadas a funciones directas. 'array()' no es una función. A partir de PHP 5.5, es bastante normal poner referencias en matrices. – Zenexer

+0

Tenga en cuenta que pasar 'nuevo' por referencia está en desuso con PHP 5.5 (?), Por lo que '$ foo = & new ReferenceObject' ya no está permitido. – kaiser

1

Directamente, puede ser imposible - sin embargo, si usted tiene el control tanto sobre la función que se están aplicando y del código que llamadas que - entonces no es una solución temporal que puede encontrar adecuado.

¿Estaría bien con tener que insertar la variable en cuestión en un objeto? El código se vería (algo así) así si lo hicieras.

function toBeCalled($par_ref) { 
    $parameter = $par_ref->parameter; 
    //...Do Something... 
    $par_ref->parameter = $parameter; 
} 

$changingVar = 'passThis'; 
$parembed = new stdClass; // Creates an empty object 
$parembed->parameter = array($changingVar); 
call_user_func_array('toBeCalled', $parembed); 

Ves, una variable de objeto en PHP no es más que una referencia a los contenidos del objeto --- por lo que si se pasa un objeto a una función, cualquier cambio que hace la función de la contenido del objeto se reflejará a lo que la función de llamada también tiene acceso.

Sólo asegúrese de que la función de llamada nunca hace una asignación a la variable de objeto en sí - o que hará la función de, básicamente, pierden la referencia. Cualquier declaración de asignación que la función realice debe ser estrictamente al contenido del objeto.

0

Esto funciona mediante doble referencia, la variable original se modifica cuando se modifica la variable $ parameter.

$a = 2; 
$a = toBeCalled($a); 
echo $a //50 

function toBeCalled(&$par_ref) { 
    $parameter = &$par_ref; 
    $parameter = $parameter*25; 
} 
Cuestiones relacionadas