Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Diferencias por valor y por referencia

Estas en el tema de Diferencias por valor y por referencia en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, Tengo unas duda existencial, si a una variable le doy el valor de un objeto y esta la edito, no debería afectar a los ...
  #1 (permalink)  
Antiguo 26/11/2008, 14:08
 
Fecha de Ingreso: noviembre-2005
Ubicación: /dev/null
Mensajes: 23
Antigüedad: 18 años, 5 meses
Puntos: 0
Diferencias por valor y por referencia

Buenas,
Tengo unas duda existencial, si a una variable le doy el valor de un objeto y esta la edito, no debería afectar a los valor del objeto original, no? En cambio si lo hago por referencia si. A no ser que cuando se trata de objetos en PHP5 siempre se haga por referencia no entiendo que pasa.

Pongo el código de ejemplo porque me da que no me he explicado demasiado bien. $xml es un objeto que contiene una array con un canal Rss.

Si hago un paso por referencia:
Código:
$channel =& $xml->rss->channel; //Aquí lo que comento de asignación por referencia
foreach($channel->item as $item) {
  $item->description = "..."; //Cambiamos valores a description
}
echo "<pre>";
print_r($xml);
echo "</pre>";
El resultado del print_r podemos ver los ... en description, así vemos que aunque hemos modificado $channel también lo ha hecho $xml al ser por referencia. Hasta aquí todo bien.

Pero si lo hacemos por valor esto no debería pasar... Cambiamos
Código:
$channel =& $xml->rss->channel;
por
Código:
$channel = $xml->rss->channel;
Y seguimos viendo que el cambio en description también afecta a $xml.

¿Alguien sabe que puede estar pasando? ¿PHP5 siempre asigna objetos por referencia?
  #2 (permalink)  
Antiguo 26/11/2008, 14:22
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Respuesta: Diferencias por valor y por referencia

Cita:
Iniciado por showlnx Ver Mensaje
¿PHP5 siempre asigna objetos por referencia?
Si, pero de todas formas tienes una manera de clonarlos.

Saludos
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #3 (permalink)  
Antiguo 27/11/2008, 05:08
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Diferencias por valor y por referencia

Cita:
Iniciado por showlnx Ver Mensaje
Pero si lo hacemos por valor esto no debería pasar... Cambiamos
Código:
$channel =& $xml->rss->channel;
por
Código:
$channel = $xml->rss->channel;
Y seguimos viendo que el cambio en description también afecta a $xml.

¿Alguien sabe que puede estar pasando? ¿PHP5 siempre asigna objetos por referencia?
En PHP5 TODOS los objetos se pasan por REFERENCIA, como cualquier lenguaje POO.

Por lo tanto el "&" en PHP5 y con Objetos no tiene sentido.

http://ar.php.net/manual/es/migration5.oop.php
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #4 (permalink)  
Antiguo 27/11/2008, 15:52
 
Fecha de Ingreso: octubre-2005
Mensajes: 42
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: Diferencias por valor y por referencia

Además de lo que ya te han dicho, te hago saber una cosa sobre el uso de foreach. Al recorrer un array con la instrucción foreach en realidad se trabaja con una copia del array, por lo que los cambios que hagas para $item->description (en tu caso) no se verán reflejados después.

De la documentación de PHP sobre el uso de foreach:
Cita:
Note: Hay que tener en cuenta que foreach trabaja con una copia de la matriz especificada y no la lista en si, por ello el puntero de la lista no es modificado como en la función each(), y los cambios en el elemento de la matriz retornado no afectan a la matriz original. De todas maneras el puntero interno a la matriz original avanza al procesar la matriz. suponiendo que bucle foreach se ejecuta hasta el final, el puntero interno a la matriz estar/aacute; al final de la matriz.
Cita:
http://es.php.net/manual/es/control-structures.foreach.php
  #5 (permalink)  
Antiguo 27/11/2008, 17:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Diferencias por valor y por referencia

Aplica como dicen en arrays, pero en objetos si puedes hacerlo.

Saludos.
  #6 (permalink)  
Antiguo 27/11/2008, 18:50
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Diferencias por valor y por referencia

Cita:
Iniciado por CAT Shannon Ver Mensaje
Además de lo que ya te han dicho, te hago saber una cosa sobre el uso de foreach. Al recorrer un array con la instrucción foreach en realidad se trabaja con una copia del array, por lo que los cambios que hagas para $item->description (en tu caso) no se verán reflejados después.

De la documentación de PHP sobre el uso de foreach:
Es incorrecto, para el caso de los objetos siempre es una referencia del mismo.

No puedes repetir esto sin estar seguro y probarlo, es una afirmación demasiado arriesgada.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #7 (permalink)  
Antiguo 28/11/2008, 08:20
 
Fecha de Ingreso: octubre-2005
Mensajes: 42
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: Diferencias por valor y por referencia

Cierto. Me cegué, vi el foreach y automáticamente pensé en su uso para listas no en objetos.
Lo siento.
  #8 (permalink)  
Antiguo 01/12/2008, 08:20
Avatar de Lord Kazuky  
Fecha de Ingreso: junio-2006
Ubicación: 7F.00.00.01
Mensajes: 123
Antigüedad: 17 años, 10 meses
Puntos: 5
Respuesta: Diferencias por valor y por referencia

Cita:
Iniciado por enriqueplace Ver Mensaje
En PHP5 TODOS los objetos se pasan por REFERENCIA, como cualquier lenguaje POO.
Bueno en PHP5 si.. pero en Java esta la clase String y aunque parezca absurdo los objetos de la clase String pasan por valor.

Técnicamente dicen: "La única excepción es la clase String , cuyos objetos no son mutables. Cualquier modificación de un objeto String lleva aparejada la creación de una nueva instancia del objeto".

Me salio en un examen y perdi ese punto por pensar que todos los objetos siempre pasaban por referencia en todos los lenguajes...

Si.. yo se que este no es el foro de Java. Pero bueno ya que estamos en el tema...
__________________
Saludos.
"Cualquier tonto puede escribir código que un computador entiende. Los buenos programadores escriben código que los humanos pueden entender. ;)"
  #9 (permalink)  
Antiguo 02/12/2008, 07:46
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Diferencias por valor y por referencia

Cita:
Iniciado por Lord Kazuky Ver Mensaje
Bueno en PHP5 si.. pero en Java esta la clase String y aunque parezca absurdo los objetos de la clase String pasan por valor.

Técnicamente dicen: "La única excepción es la clase String , cuyos objetos no son mutables. Cualquier modificación de un objeto String lleva aparejada la creación de una nueva instancia del objeto".

Me salio en un examen y perdi ese punto por pensar que todos los objetos siempre pasaban por referencia en todos los lenguajes...

Si.. yo se que este no es el foro de Java. Pero bueno ya que estamos en el tema...
Sí, tienes razón, no me acordaba ese caso en Java , pero bueno, conceptualmente todos los objetos son por referencia en los lenguajes POO (salvo contadas excepciones en contados lenguajes).
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:02.