Singleton – Aplicando o padrão de projeto Singleton com PHP

Olá pessoal! Hoje falarei de um padrão de projeto chamado SINGLETON, este padrão de projeto que é MMUUUUIIIIITTTTOOOOOO útil para vida de sua aplicação, para reutilização de suas instâncias e dentre outras vantagens.

Resumindo, Singleton serve para: Definir uma instância única para um determinado objeto.

Tá, mas como faço isso no PHP ?

Ok, vamos para um pouco de código para que tudo fique mais claro. Vocês verão como é simples adotar este padrão de projeto no PHP:

class Exemplo
{ 
    // Este atributo guarda uma instância da classe
    private static $instance = null;
 
    // Atributo que armazenara um texto para realizarmos um teste
    private $texto;
 
    // Um construtor privado! Isso previne que a
    // criação direta do objeto
    private function __construct() { }
 
    // O método singleton
    public static function getInstance()
    {
        if (!isset(self::$instance) && is_null(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
 
        return self::$instance;
    }
 
    // Metodo SET, onde sera colocado um valor para
    // o atributo "texto"
    public function setTexto($texto)
    {
        $this->texto = $texto;
    }
 
    // Metodo GET, onde sera retornado o valor atual
    // do atributo "texto"
    public function getTexto()
    {
        return $this->texto;
    }
}

Aqui, nós criamos uma classe chamada Exemplo, onde é assinado 4 métodos:

  • __construct (Construtor privado) – esse método é para evitar que essa classe seja instanciada de forma direta, ou seja, somente o método estático “getInstance” poderá instanciar esta classe;
  • getInstance – é o método que será responsável de verificar se esta instância já foi feita anteriormente em algum parte do ciclo de vida da aplicação. Caso ele já tenha sido criado retornará o próprio objeto, caso contrário, aí sim ele criará uma instância e armazenará no atributo “$instance”. (Você pode colocar qualquer nome neste método =D);
  • setTexto – este método simplesmente irá popular o atributo “texto”, para que a gente realize um pequeno teste;
  • getTexto: este método simplesmente irá retornar o valor atual do atributo “texto”;

Muito legal e tudo, mas como eu uso esse treco ?

Se preparem para horas e horas de leitura de códigos, pois esta parte é muito extensa e cansativa:

$exemplo1 = Exemplo::getInstance();
$exemplo2 = Exemplo::getInstance();
$exemplo1->setTexto('Meu singleton funcionando legal !');
echo "Utilizando o EXEMPLO 1: " . $exemplo1->getTexto() . "<br />";
echo "Utilizando o EXEMPLO 2: " . $exemplo2->getTexto();

RRRÁÁÁÁ, pegadinha do malandro ! ié ié…  =P

Isso mesmo, neste código acima a variável $exemplo1 instancia a classe Exemplo (new Exemplo), já a variável $exemplo2 utiliza da mesma instância $exemplo1 fazendo com que ambas desfrutem dos recursos do mesmo objeto.

Se você tiver 1.453 variáveis que chamem o métodos getInstance() da classe Exemplo todas elas utilizarão os recursos de um mesmo objeto.

Você pode compor a sua classe com “n” métodos que você achar necessário e fazer a chamada normalmente, como:

$exemplo1->estudar();
$exemplo1->andar();
$exemplo1->visitarBlogYiiAcedemy(); // =D

Nossa!!! Muito legal e muito fácil de usar! Mas em que situações eu utilizarei esse padrão de projeto?

Ótima pergunta jovem guerreiro padawan! Este padrão de projeto pode ser utilizado para garantir uma única instância para conexão com a base de dados da sua aplicação (inclusive a maioria dos frameworks PHP mais populares utiliza para este propósito e para muitos outros), e como você já sabe o conceito e como utilizar, se você achar pertinente ter que utilizar uma instância só para uma e suas classes, nem pense duas vezes.

Bom, é isso pessoal! Espero que vocês tenham gostado do artigo e qualquer dúvida é só comentar no post que atenderei assim que possível.

Forte abraço e bons Estudos!