Ver Mensaje Individual
  #6 (permalink)  
Antiguo 20/02/2004, 11:51
Avatar de Webstudio
Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
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