¿Las variables PHP se pasan por valor o por referencia?
php
variables
pass-by-reference
pass-by-value
cmcculloh
fuente
fuente
Respuestas:
Es por valor de acuerdo con la documentación de PHP .
fuente
$str = add_some_extra($str);
si no estuviera usando la referencia, ¿verdad? entonces, ¿cuál es el verdadero valor agregado de eso?$str
lo que se asignaría nulo, en su caso.En PHP, por defecto, los objetos se pasan como copia de referencia a un nuevo objeto.
Ver este ejemplo .............
Ahora mira esto ..............
Ahora mira esto ..............
Espero que puedas entender esto.
fuente
$y
no es necesario, no hay nadafunction changeValue
que requiera que esté adentroclass Y
, de modo que se enreden dos conceptos no relacionados. Me mudaríafunction changeValue
al alcance exterior, justo arriba$x = new X();
. Eliminar todas las referencias a$y
. Ahora es más fácil ver que los dos primeros ejemplos dejan solo $ x, y el tercero cambia su contenido anew Y()
. Lo que sería más fácil para ver si se vació eltype
de$x
- el hecho de que tantoX
yY
pasan a incluir un$abc
campo también es irrelevante para lo que se demuestraParece que mucha gente se confunde por la forma en que se pasan los objetos a las funciones y por lo que pasa por referencia. Las variables de objeto todavía se pasan por valor, es solo el valor que se pasa en PHP5 es un identificador de referencia. Como prueba:
Salidas:
Para el paso por referencia significa que podemos modificar las variables que son vistos por la persona que llama. Lo que claramente no hace el código anterior. Necesitamos cambiar la función de intercambio a:
Salidas:
para pasar por referencia.
fuente
swap
función; en otras palabras, si los objetos fueron "pasados por valor". Por otro lado, también es exactamente lo que esperaría si se pasara un identificador de objeto a la función, que en realidad es lo que sucede. Su código no distingue entre estos dos casos.http://www.php.net/manual/en/migration5.oop.php
fuente
Las variables PHP se asignan por valor, se pasan a funciones por valor, y cuando contienen / representan objetos se pasan por referencia. Puede forzar que las variables pasen por referencia usando un &
Asignado por valor / ejemplo de referencia:
saldría
Aprobado por valor / referencia examen:
daría salida:
Variables de objeto pasadas por examen de referencia:
Daría salida:
(ese último ejemplo podría ser mejor probablemente ...)
fuente
$foo
es un puntero a un objeto .$foo
se pasa por valor a la funciónchangeFoo()
, yachangeFoo()
que no declaró su parámetro con a&
.Puede pasar una variable a una función por referencia. Esta función podrá modificar la variable original.
Puede definir el pasaje por referencia en la definición de la función:
fuente
Puedes hacerlo de cualquier manera.
ponga un símbolo '&' al frente y la variable que está pasando se convierte en una y la misma que su origen. es decir: puede pasar por referencia, en lugar de hacer una copia de la misma.
entonces
fuente
Las variables que contienen tipos primitivos se pasan por valor en PHP5. Las variables que contienen objetos se pasan por referencia. Hay un artículo bastante interesante de Linux Journal de 2006 que menciona esta y otras diferencias OO entre 4 y 5.
http://www.linuxjournal.com/article/9170
fuente
&
.Los objetos se pasan por referencia en PHP 5 y por valor en PHP 4. ¡Las variables se pasan por valor por defecto!
Lea aquí: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html
fuente
&
.&
delante de los parámetros en la definición; si se pasaran por valor, el objeto contenido en el ámbito que llamaba a la función como parámetro lo haría No ser afectado.Los atributos siguen siendo modificables cuando no se pasan por referencia, así que tenga cuidado.
Salida:
SwapObjects: b, a SwapValues: a, b
fuente
Para cualquiera que se encuentre con esto en el futuro, quiero compartir esta joya de los documentos PHP, publicados por un usuario anónimo :
Y aquí está el ejemplo que brindan:
Escribí una publicación de blog extensa y detallada sobre este tema para JavaScript , pero creo que se aplica igualmente bien a PHP, C ++ y cualquier otro lenguaje donde la gente parece estar confundida acerca de pasar por valor frente a pasar por referencia.
Claramente, PHP, como C ++, es un lenguaje que admite paso por referencia. Por defecto, los objetos se pasan por valor. Cuando se trabaja con variables que almacenan objetos, ayuda ver esas variables como punteros (porque eso es fundamentalmente lo que son, a nivel de ensamblaje). Si pasa un puntero por valor, aún puede "rastrear" el puntero y modificar las propiedades del objeto al que apunta. Lo que no puede hacer es que apunte a un objeto diferente. Solo si declara explícitamente que un parámetro se pasa por referencia podrá hacerlo.
fuente
En realidad, ambos métodos son válidos, pero depende de sus requisitos. Los valores de referencia por referencia a menudo hacen que su secuencia de comandos sea lenta. Por lo tanto, es mejor pasar las variables por valor considerando el tiempo de ejecución. Además, el flujo de código es más consistente cuando pasa variables por valor.
fuente
Use esto para funciones cuando desee simplemente alterar la variable original y devolverla nuevamente al mismo nombre de variable con su nuevo valor asignado.
fuente
Depende de la versión, 4 es por valor, 5 es por referencia.
fuente