2009-10-09 19 views
6

Quiero llamar a una función con call_user_func_array pero noté que si un argumento es una referencia en la definición de función y es un valor simple en call_user_func_array, aparece la siguiente advertencia: Advertencia: se espera que el parámetro 1 para test() sea un referencia, el valor dadoPHP ¿Cómo saber si una variable es una referencia?

Aquí es un simple ejemplo de lo que estoy tratando de hacer:

<?php 
$a = 0; 
$args = array($a); 
function test(&$a) { 
    $a++; 
} 
$a = 0; 
call_user_func_array('test', $args); 
?> 

Mi pregunta es: ¿Cómo puedo saber si un valor (en este caso, el primer valor de $ args) es una referencia o no?

Respuesta

2

ver los comentarios en esta página documentación de PHP:

http://php.net/manual/en/language.references.spot.php

+1

Todo lo que veo es funciones para comprobar si dos matrices/objetos/variables apuntan a la misma área de memoria modificando uno y comprobar si el otro también está modificado. En mi código (no el ejemplo, el real), solo tengo la matriz de argumentos y quiero saber si un argumento es una referencia. De esta manera, puedo lanzar un error si la función de devolución de llamada quiere una referencia y la matriz contiene un valor simple. –

+0

Ya desencadena una advertencia, que está destinada a los desarrolladores. ¿Qué tipo de error quieres? Podría [configurar un controlador de error personalizado] (http://php.net/set_error_handler) si desea modificar el comportamiento – cmbuckley

4

No, la cuestión es que el primer parámetro de la función es el paso por referencia (es decir, la función puede modificar el argumento de el alcance de la persona que llama). Por lo tanto, debe pasar una variable o algo que se puede asignar como primer argumento. Cuando crea la matriz como array($a), simplemente copia el valor de la variable $a (que es 0) en una ranura de la matriz. No se refiere a la variable $a de ninguna manera. Y luego, cuando se llama a la función, es como si usted está haciendo esto, lo que no funciona:

test(0) 

Si realmente quisiera, podría poner $a en la matriz por referencia, pero es un poco difícil :

<?php 
$a = 0; 
$args = array(&$a); 
function test(&$a) { 
    $a++; 
} 
call_user_func_array('test', $args); 
?> 

En cuanto a cómo se diría, que el elemento de matriz es una referencia ... eso es difícil. Usted podría hacer var_dump() en la matriz, y la búsqueda del símbolo "&":

> var_dump($args); 
array(1) { 
    [0]=> 
    &int(1) 
} 
+0

Sí, sé que el código funciona de esa manera. Solo quería una forma de asegurarme de que el array $ args (que puede contener algo, ya que en mi código es pasado por otra función) ha sido creado de esa manera para evitar cualquier error cuando llamo a call_user_func_array. Es por eso que quería saber cómo comprobar si las variables en la matriz eran referencias o no. –

Cuestiones relacionadas