Singleton

“Singleton, é um padrão de projeto de software (do inglês Design Pattern). Este padrão garante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto.”

fonte: Wikipédia

Agora que já sabemos do que se trata Singleton, vou ensinar uma forma prática de fazer em php.

class minhaSingleton
{
   static protected $Singleton;
   public $teste = 'teste'; // para efeito de testes/exemplos

   /* previne instanciar deliberadamente */
   protected function __construct() { /* seu construtor */ }

   /* previne clonar o objeto gerando novas instâncias */
   public function __clone()
   {
      throw new Exception("Não é possível clonar o objeto.");
      return null;
   }

   /* adquire a instância caso exista ou a cria */
   static public function &Instance()
   {
      if ( ! self::$Singleton instanceof self )
      {
         self::$Singleton = new self;
      }
      return self::$Singleton;
   }
}

/* exemplos... */
$Instancia1 = minhaSingleton::Instance();
$Instancia2 = minhaSingleton::Instance();
$Instancia1->teste = 'variavel';

echo $Instancia2->teste; // imprime: variavel

$Instancia3 = new minhaSingleton(); // erro fatal!

/* NOTA: $Instancia1 ===$Instancia2 é verdadeiro */

Acontece que quando declaro $Instanca1 e $Instancia2 elas recebem uma referência a minhaSingleton::$Singleton, que por sua vez não pode ser acessada de fora do escopo da classe. Caso $Singleton não seja um objeto instanciado da própria classe ele instancia e retorna a referência.

Quando atribuo “variavel” para $Instancia1->teste, na realidade, foi atribuido para minhaSingleton::$Singleton->teste, e quando mando imprimir $Instancia2->teste ele busca em minhaSingleton::$Singleton->teste, o que dá o retorno esperado.

Quanto tento instanciar $Instancia3 pelos métodos convencionais eu recebo um erro fatal, pois como o construtor (__construct()) é protegido, o mesmo não pode ser acessado de fora do escopo da classe.

Basicamente é isso. O link da wikipédia tem alguns outros detalhes para melhor entendimento do que se trata o singleton.

Tags: , , ,

Leave a Comment

Usuários do Twitter
Clique no botão abaixo para efetuar o login usando sua conta do Twitter.

Performance Optimization WordPress Plugins by W3 EDGE