Inicio | Pedro Santana |  RSS  Mi tumblelog  Mis photos  Mi CV

 

Patrón singleton en PHP4

Después de mucho tiempo, aquí estoy con la siguiente entrega de la serie sobre patrones de diseño con PHP, la siguiente entrega que estaba planeada era sobre el patrón factory (fábrica o factoría), pero en estos días programé un plugin engine para gelato el cual esta versión aún debe contar con soporte para PHP4 y me topé con que una vez terminado y probado no funcionaba correctamente en PHP4, por dos detalles:

1.- PHP4 no soporta propiedades estáticas (soporta métodos estáticos y variables estáticas dentro de estos métodos, pero NO propiedades),la solución a esto vendrá en otro post.
2.- La implementación del patrón singleton más difundida no funciona como debería.

Veamoslo en bits.

  1. class Singleton{
  2.     var $accion;       
  3.        
  4.     function &instancia(){
  5.         static $_instancia;
  6.         if(!isset($_instancia)){
  7.             $_instancia =& new Singleton();
  8.         }
  9.         return $_instancia;
  10.     }   
  11. }

La clase anterior implementa el código de singleton en PHP4 más encontrado en los ejemplos sobre el tema.

Si la probamos creando el objeto obj1:

  1. $obj1 =& Singleton::instancia();
  2. $obj1->accion = "Imprimir";

Si imprimimos su valor:

  1. var_dump($obj1->accion);
  2. // imprime: string(8) "Imprimir"

Creamos el objeto obj2:

  1. $obj2 =& Singleton::instancia();
  2. $obj2->accion = "Borrar";

¿Qué contenido tiene?

  1. var_dump($obj2->accion);
  2. // imprime: string(6) "Borrar"

Entonces ya tenemos dos objetos derivados de la clase Singleton los cuales al implementar dicho patrón deberamos tener UNA sola instancia, ¿pero esto se cumple?

  1. echo $obj1->accion;

¿Qué nos devuelve?

Imprimir

Como vemos nos regresa el valor “Imprimir” cuando estamos esperando que imprima “Borrar”.

Para solucionarlo basta con tocar una sola línea de código de la clase y cambiar la línea 7 por lo siguiente:

  1. $_instancia = new Singleton();

Ahora si, nuestras pruebas saldrán correctas.

Un comentario en “Patrón singleton en PHP4”

 

 

Deja un comentario