Los requisitos para este patrón son dos:
- Un único punto de acceso a la variable única o singleton, accesible desde todo el resto del código.
- Constructor privado para que sólo la propia clase sea capaz de manejar la creación de si misma.
Hay aspectos avanzados en todo este patrón que no voy a tratar aquí, simplemente voy a contar una implementación básica y como pie de post mencionaré los otros aspectos.
Para crear un constructor privado en PHP:
private function __construct(){}La clase tendrá una instancia de sí misma, privada y estática:
private static $instanceY existirá un método para acceder a esta variable y que en caso de no existir, se creará. Este método será público para que sea accesible desde todos sitios y estático, pues en un principio no contaremos con ninguna instancia de la variable.
public static function getInstance(){
  if(self::$instance == NULL){
   self::$instance = new Singleton();
  }
  return self::$instance;
}Poniendo todo junto, quedaría algo así:
class Singleton{
 
   private static $instance;
 
   private function __construct(){}
 
   public static function getInstance(){
   if(self::$instance == NULL){
     self::$instance = new Singleton();
   }
   return self::$instance;
 }
 
   public function test(){
     echo "Cualquier cosa";
   }
 }
Y para hacer uso de ello, sería de la siguiente manera:
Singleton::getInstance()->test();Los aspectos más avanzados que decía que hay que tener en cuenta son la clonación y la serialización: todavía sería posible crear otras instancias del objeto Singleton mediante una clonación o serialización/deserialización. Para controlar esto se debe limitar el uso del método __clone y __wakeup lanzando un error en caso de que sean llamados 
 
No hay comentarios:
Publicar un comentario