2011-01-20 8 views
7

Referencias:Ayúdame a entender PHP referencias a variables y el alcance

  1. Si paso una variable a una función (por ejemplo, $ var), es que supone que es una copia de una referencia a la variable real (tal que establecerlo nulo no afecta a otras copias)?
  2. ¿O está recibiendo una referencia a lo que es una copia nueva de la variable real (de modo que al establecerlo como nulo se destruye solo su copia)?
  3. Si es el último, ¿copia esto objetos y matrices en la memoria? Parece que es una buena manera de perder memoria y tiempo de CPU, si es así.

Creo que puedo entender el paso por referencia (por ejemplo, & $ var) correctamente al saber cómo funciona esto, primero.

Alcance:

  1. Cuál es el trato con el ámbito local? ¿Estoy en lo cierto al observar que puedo declarar una matriz en una función y luego usar esa matriz en otras funciones llamadas dentro de esa función SIN pasarlas como un parámetro?
  2. De forma similar, ¿declarar en conjunto una función llamada dentro de una función permite que esté disponible en la persona que llama?
  3. Si no, ¿el trabajo de alcance por una pila de llamadas o algo así como cada cosa sangrienta que he llegado a entender sobre la programación me dice que debería?

PHP es muy divertido. :(

+0

Relacionados (responde a algunas de las preguntas hechas aquí): [en PHP puede alguien explicar la clonación vs referencia de puntero] (http://stackoverflow.com/questions/3611986/in- php-can-alguien-explicar-clonar-vs-puntero-referencia/3612129 # 3612129) – ircmaxell

+0

Haga una pregunta a la vez. Y para * cada * pregunta, debe buscar para ver si alguien más ya respondió su pregunta. La mayoría de estas preguntas son duplicados. – zzzzBov

Respuesta

2

Si paso una variable a una función (ej. $ Var), ¿se supone que es una copia de una referencia a la variable real (tal que establecerla nula no afecta a otras copias)?

Depende de la función y también cómo se llame vistazo a este ejemplo:.. http://www.ideone.com/LueFc

o se trata recibiendo una referencia a lo que es una nueva copia de la variable real (tal que su creación en null destruye su copia solamente)? ​​

De nuevo depende de la función

En este último caso, ¿se copian objetos y matrices en la memoria? Parece que es una buena manera de perder memoria y tiempo de CPU, si es así.

Va a ahorrar memoria para usar una referencia, por supuesto. En php> 4 siempre usa referencia para objetos a menos que especifique lo contrario.

¿Cuál es el problema con el alcance local? ¿Estoy en lo cierto al observar que puedo declarar una matriz en una función y luego usar esa matriz en otras funciones llamadas dentro de esa función SIN pasarlas como un parámetro?

No, no puedes.

De manera similar, ¿declarar en conjunto una función llamada dentro de una función permite que esté disponible en la persona que llama?

No, no es así.

Si no, ¿el trabajo de alcance por una pila de llamadas o algo así como cada cosa sangrienta que he llegado a entender sobre la programación me dice que debería?

Si desea utilizar una variable de fuera de la función, antes de usarlo, se escribiría global $outsidevar

+0

¿Qué hay de usar una variable definida en una función de llamada dentro de una función llamada? La variable no está en el alcance global, ¿verdad? – Hamster

+0

Pruébelo y vea. http://www.ideone.com/7N35D – profitphp

+0

¿No estoy viendo la salida? Editar: Eso no es lo que quise decir exactamente, sin embargo. Me refiero a usar 'global' para importar la variable en esa situación aún funciona? – Hamster

1

En cuanto a su primera serie de preguntas:

foo($a); 
function foo($b) { echo $b; } 

En este caso, $a no se copiará en una nueva variable $b, solo porque se pasa por valor.

Esto se debe a que PHP utiliza el concepto de copiar y escribir. PHP no copiará el contenido de una variable, a menos que se modifiquen. En cambio, PHP incrementará la propiedad refcount del "zval" existente de $a.

Bueno, no es tan trivial, pero para responder a su pregunta: No, no copia la variable, a menos que escriba en la función y no, no guardará la CPU y la memoria utilizando una referencia. En la mayoría de los casos, la referencia no cambiará el rendimiento en absoluto, pero en el peor de los casos la degradará (porque si ya no existe una variante is_ref de la variable y se crea una referencia, el valor de la variable debe copiarse para obtener un zval con is_ref y uno sin). Optimizar el código mediante el uso de referencias no es bueno.

+0

Puede que no ser un buen consejo de optimización para exprimir el rendimiento, pero ciertamente ahorra memoria para usar una referencia. Especialmente con objetos, ya que pueden agrandarse. No importa ... solo lo estaba investigando, pensé que eran como punteros ... actúan así. pero no lo son – profitphp

1

si el argumento de una función se define como "función my_function ($ variable) {}" entonces obtendrá una copia de la variable y cualquier alteración hecha a la variable dentro de su función no estará disponible para la función llamante . se puede pasar una variable por referencia anteponiendo un símbolo de unión al argumento de la hora de definir su función y por lo tanto cualquier alteración realizada a la variable persistirán a la función de llamada, es decir, "la función mi_funcion (& $ variable) {}"

function myfunction($var) { 
    $var = 'World'; 
} 
$var = 'Hello'; 
myfunction($var); 
echo $var; // 'Hello'; 

Paso de una variable por referencia

function myfunction(&$var) { 
    $var = 'World'; 
} 
$var = 'Hello'; 
myfunction($var); 
echo $var; // 'World' 
Cuestiones relacionadas