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

Sobre variables estáticas y Singleton en PHP4

Estas en el tema de Sobre variables estáticas y Singleton en PHP4 en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola: A raíz de otra pregunta de aviana sobre cómo utilizar atributos estáticos en PHP4... estuve revisando la implementación de un Singleton que dejó Webstudio ...
  #1 (permalink)  
Antiguo 09/03/2005, 17:31
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Sobre variables estáticas y Singleton en PHP4

Hola:
A raíz de otra pregunta de aviana sobre cómo utilizar atributos estáticos en PHP4... estuve revisando la implementación de un Singleton que dejó Webstudio en este post:
http://www.forosdelweb.com/showpost....68&postcount=7

Pues al probarlo me dí con la sorpresa de que no funciona como se espera. Y tiene que ver con el hecho de referenciar a o no la primera instancia.

Este es el ejemplo que probé:
Código PHP:
class Ejemplo{
    var 
$atributo;
    function &
instancia(){
        static 
$_instancia;
        if(empty(
$_instancia)){
            
$_instancia = & new Ejemplo();// OJO!!! A esta línea me voy a referir
        
}
        return 
$_instancia;
    }
}

$obj1 = &Ejemplo::instancia();
$obj1->atributo "Uno";
$obj2 = &Ejemplo::instancia();
$obj2->atributo "Dos";
echo 
$obj1->atributo;// Esperaríamos que imprima "Dos" 
Si se referencia tal como está puesto en la línea marcada... no funciona, pues sigue creando nuevas instancias.
Si en esa línea no se pone el operador "&", o sea simplemente se deja:
Código PHP:
$_instancia =  new Ejemplo(); 
Ahí sí funciona.

¿Alguien podría explicar el por qué de este comportamiento?

Saludos
  #2 (permalink)  
Antiguo 11/03/2005, 11:01
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 22 años, 7 meses
Puntos: 6
Segun entiendo en la documentacion cuando devuelves una referencia mediante una funcion no es necesario referenciar lo que devuelves, es decir que con la modificacion que hiciste funciona como se espera, pero el caso anterior no. Yo creo que para eso hay muy poco que decir, sera una buena idea que lo publiques en la documentacion de php, por que el comportamiento me temo es cuestion de como el interprete usa la asigancion por referencia dentro de una funcion que devuelve una referencia en si, es decir hay que preguntarle a los desarrolladores si no se les "escapo" ese caso dentro de la programacion.
  #3 (permalink)  
Antiguo 11/03/2005, 15:58
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Cita:
Iniciado por Herminio Heredia San
Segun entiendo en la documentacion cuando devuelves una referencia mediante una funcion no es necesario referenciar lo que devuelves, es decir que con la modificacion que hiciste funciona como se espera, pero el caso anterior no. Yo creo que para eso hay muy poco que decir, sera una buena idea que lo publiques en la documentacion de php, por que el comportamiento me temo es cuestion de como el interprete usa la asigancion por referencia dentro de una funcion que devuelve una referencia en si, es decir hay que preguntarle a los desarrolladores si no se les "escapo" ese caso dentro de la programacion.
Hola Herminio:
Yo también estuve leyendo en la documentación.
Parece que el tema no tiene que ver con lo que devuelven las funciones. Es más, si no referencias lo que devuelves perderías la instancia (y utilizarías una copia).

El tema va por el lado de las palabra reservada "static". Según puedo ver, parece que al declarar una variable como "static", ésta automáticamente se referencia, por lo que utilizar el operador "&" provocaría un comportamiento no deseado (¿se des-referencia la variable?).
Conclusión: No se pueden guardar referencias en variables estáticas en PHP4.
Lo que hay que tener en cuenta es que no se produce ningún mensaje de error... simplemente se comporta de otra manera.

Aquí está bastante bien documentado.
http://www.php.net/variables.scope

Saludos
  #4 (permalink)  
Antiguo 14/03/2005, 10:07
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 22 años, 7 meses
Puntos: 6
Leyendo mas detalladamente , el detalle como comentas es por que el interprete de php para la version 4, inplmenta estructuras basandose en la referencia, es decir que el uso de global, static y $this usan referencia de forma predeterminada, en el caso de global siempre hace referencia a la variabel global "real" en el caso de estatic siempre se asigna una referencia por eso no es necesario pasarla referencia de forma explicita, y por eso no se puede asignar un valor mediante una expresion. El caso de $this siempre devuelve la referencia al objeto al que llama.
Este tema a sido interesante y que bueno que lo abordaste, aqui nos damos cuenta lo falible que somos al olvidar detalles como este en algunas ocasiones, y que nos puede costar tiempo deducirlo cuando estamos programando.
  #5 (permalink)  
Antiguo 14/03/2005, 11:45
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 6 meses
Puntos: 69
La verdad, estoy sorprendidísimo por el hallazgo, la única clase en la que implementaba el Singleton anteriormente, no contenía esta falencia por otro cambio que tenía, por utilizar un Factory para recuperar la clase que se guardaria en el static, pero en otras dos o tres clases nuevas, cometía este error, y estaba duplicando objetos, por suerte ahora lo cambié gracias a tu comentario y puedo estar seguro que en todo momento de la aplicación, tengo una sola instancia.
Luego les hago un comentario sobre la manera de devolver el Static que estuve probando.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #6 (permalink)  
Antiguo 17/03/2005, 21:23
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Este tema ha sido bastante interesante...
Cita:
Iniciado por Webstudio
Luego les hago un comentario sobre la manera de devolver el Static que estuve probando.
Estaremos esperando con ansias ese comentario prometido...
Saludos
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 03:24.