Foros del Web » Programando para Internet » PHP »

Crear objetos sin & y con &

Estas en el tema de Crear objetos sin & y con & en el foro de PHP en Foros del Web. Hola, Me han comentado que al assignar un objeto con & , este objeto se passa por referencia, mientras que si no ponemos &, el ...
  #1 (permalink)  
Antiguo 18/02/2004, 19:28
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Crear objetos sin & y con &

Hola,

Me han comentado que al assignar un objeto con & , este objeto se passa por referencia, mientras que si no ponemos &, el objeto se passa por valor.

Ok, entiendo que quiere decir passar por valor, passar por referencia en funciones, referencias, pero no lo entiendo que implica a la hora de crear objetos.

Ej:

obj1 = &new object(4);
obj2 = &new object(5);
obj1->print(); // El resultado es 5, no?

obj1 = new object(4);
obj2 = new object(5);
obj1->print(); // El resultado es 4, no?

obj1 = &new object(4);
obj2 = new object(5);
(Y yo que se...)

obj1 = new object(4);
obj2 = &new object(5);
(Lo mismo)

No lo comprendo..ufff. que fruste..

Si pudiesseis ponerme un exemplo para cojer la idea seria muy valioso.

Gracias
  #2 (permalink)  
Antiguo 18/02/2004, 21:33
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 16 años, 1 mes
Puntos: 68
Muchas veces se utiliza el operador de referencia al crear objetos, por la mala gestión de referencias de objetos que tiene PHP, que siempre copia los objetos, en vez de referenciarlos.

La cosa es asi, suponete que tenés esto :
$algo = new UnObjeto( $otro_objeto );

En este caso, PHP lo primero que hace es buscar el método UnObjeto dentro de la definición de la clase, recibe el objeto $otro_objeto y se lo asignará a algún atributo o lo que sea, y después, PHP copia el objeto recién instanciado ( operador = ) y lo asigna a la variable $algo. EntendéS? Crea, copia, asigna.

En cambio, al utilizar la referencia (&) en la creación, en $algo te queda exactamente el mismo objeto que se crea en el Constructor. Esto es de mucha utilidad cuando en el constructor de un objeto, instanciás o le pasas una referencia propia del obeto ($this) a algun otro...

Consejo, siempre al instanciar utilicen =&, creanme que es para ahorrarse dolores de cabeza después.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #3 (permalink)  
Antiguo 19/02/2004, 02:45
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 16 años, 1 mes
Puntos: 5
Bueno webestudio lo a explicado muy bien, el caso es que ese tipo de errores de PHP se esta solucionando en PHP5 ya que las referencias se hacen internamente, automaticamente, por lo cual al instanciar el objeto siempre te lo asignara mediante referencia. Pero bueno ata que salga PHP5 habra que referenciarlos :P

Saludos!!
__________________
Usuario registrado de Linux #288725
  #4 (permalink)  
Antiguo 19/02/2004, 09:47
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 16 años, 1 mes
Puntos: 68
Bueno Epples, muchas gracias por tu comentario, te juro que dejé este mensaje con la sensación de que me había explicado para la miércoles, y pensaba poner algo de código por las dudas...
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #5 (permalink)  
Antiguo 19/02/2004, 14:02
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Si puedes poner algo de código, seria útil.. gracias.
Por cierto que tipos de errores existe al no poner &?
  #6 (permalink)  
Antiguo 20/02/2004, 11:51
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 16 años, 1 mes
Puntos: 68
Bueno, un poquito, pero nada más ( como me gusta hacerme rogar :D )

Primero, un caso simple para que comencemos a entender por que lado viene el problema.

Código PHP:
<?php 
class Prueba
{
    function 
Prueba()
    {
        
//Acá se está preparando el Objeto cuya instancia es "A"
    
}
}

// Acá, después de la asignación, la variable $obj recibe una COPIA del objeto A, por el uso de la asignación, y no una referencia hacia A. Entonces, podemos decir que en el construcctor, se trabajó con un objeto A y en $obj hay un objeto B que es copia de A
$obj = new Prueba();
?>
Entonces, es esto realmente un problema? Bueno, la mayoría de las veces no, salvo por un pequeño uso extra de memoria innecesaria para hacer la copia. Pero en casos como el siguiente, si es un problema :

Código PHP:
<?php
class Observador
{
    function 
Observador(&$objeto)
    {
        
// Acá como vemos, se le pasa una referencia al Objeto que antes llamamos A
        // o sea, el que está en memoria al momento de instaciar
        
$objeto->agregarObservador($this);
    }
}

class 
Observable
{
    var 
$observadores;
    
    function 
agregarObservador(&$observador)
    {
        
$this->observadores[] =& $observador;
    }
}
// Entonces, primero instanciamos el Objeto que puede ser Observado por otros
$observable = new Observable();
// Y ahora viene el problema de no usar Referencias, y es que al instanciar
// el observador sucede lo siguiente:
$observador = new Observador($observable);
// el Objeto $observable, tiene en su array interno de Observadores al la instancia A
// de Observador, y la variable $observador tiene a la instancia B (copia) del objeto
// O sea que si quisieramos cambiar alguna opcion del objeto:
$observador->set('mostrarHTML'true);
// Estamos cambiando el objeto B y este cambio no se va a reflejar en la instancia A
// que posee el objeto $observable. Esto se puede ver utilizando :
print_r($observador);
print_r($observable->observadores[0]);
?>
Todo esto se resuelve, utilizando siempre el operador & en el New, ya que nos estamos asegurando que $observador ahora es una referencia al MISMO objeto que $observable tiene en su array interno.

Espero que ahora si les quede un poco más claro el asunto...

(mmmhh.. no deberia haber puesto esto como un Tutorial Rápido en zonaPHP? )
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.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 20:30.