PHP Singleton - Aplicando o padrão de projeto na prática

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (5)  (0)

Veja neste artigo como aplicar o padrão de projeto Singleton na prática na linguagem PHP.

Introdução aos Padrões de Projetos

Este conceito de padrões de projeto é antigo e não teve origem na área de informática, muito pelo contrário, este foi herdado da Arquitetura onde se viu a necessidade de seguir padrões.

Porque seguir padrões se desenvolvo de uma forma totalmente diferente e sempre dá certo? A grande questão em seguir padrões é uniformizar o desenvolvimento e permitir que qualquer outro analista possa olhar seu código e entende-lo. Fazer sua aplicação funcionar está muito longe do sinônimo para software de qualidade, imagine se os fabricantes de automóveis julgassem um carro como "perfeito" apenas ligando o mesmo e ouvindo o barulho do motor.

Mesmo que você trabalhe por conta própria, sem nenhuma equipe, é ideal a utilização de padrões, isso porque a manutenção do software pode-se se tornar onerosa se nem ao menos você entender o que você mesmo fez a 5 anos naquele determinado trecho de código.

Para quem já trabalhou em grandes projetos, com toda uma estrutura de multicamadas, SVN, testes e etc., sabe muito bem que é indispensável à padronização de toda a aplicação, e quando falamos de padronização estamos falando também de cores, fontes, títulos, tamanhos de telas e endentações.

Que padrões usar?

De fato não existe um padrão de projeto ideal, na verdade muitos projetos utilizam diversos padrões para tentar atingir um nível de excelência, um padrão que é implementado em quase todo projeto é o SINGLETON, que daremos foco neste artigo. Existem ainda muitos outros, e na verdade são tantos que algumas vezes acabam confundindo a equipe sobre qual padrão está sendo aplicado naquele momento. A maioria dos frameworks, se não todos, utilizam algum framework como base: ZendFramework, Hibernate, Spring e etc.

No início a mudança de paradigma para que não está acostumado com padrões é um verdadeiro choque, mas depois de assimilado todo o padrão e a boa utilização do mesmo, com certeza é um caminho sem volta, isso porque o aumento da produtividade é consideravelmente alta e satisfatória.

Aplicando o padrão Singleton

Este padrão de projeto faz com que objetos sejam criados apenas uma vez na memória. Significa que sempre que o objeto por chamado em qualquer parte do código, o padrão de projeto Singleton se encarregará de retornar sempre a mesma instância do objeto, e caso este não existe, então ele solicitará a criação de um novo pelo construtor da classe. Podemos dizer que este é um dos projetos mais utilizados em qualquer projeto, isso porque ele previne um possível stack overflow (estouro de pilha), ainda mais em aplicações Web.

O código abaixo é a aplicação do Singleton em um caso muito comum: a criação de um objeto para conexão com o banco de dados.

Listagem 1: Aplicação do Padrão Singleton

<?php

class Conexao {

    public static $instance;

    private function __construct() {
        //
    }

    public static function getInstance() {
        if (!isset(self::$instance)) {
            self::$instance = new PDO('mysql:host=localhost;dbname=mydatabase', 'root', '123', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));            
            self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            self::$instance->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);
        }

        return self::$instance;
    }

}

?>

Não se atente a linguagem, pois o legal de padrões de projeto é que você poderá aplicar ele a praticamente qualquer linguagem que tenha no mínimo um paradigma orientado a objetos. O objeto conexão é um ótimo exemplo para aplicação deste padrão, isso porque se você parar para pensar só precisamos de 1 objeto conexão em toda nossa aplicação, ou seja, você cria a "ponte" de conexão com o banco de dados somente 1 vez e a utiliza durante toda aplicação, imagine se você criasse uma nova conexão cada vez que fosse fazer um SELECT, com certeza você estaria sobrecarregando sua aplicação.

  1. A primeira regra para se implementar o Singleton é sempre deixar o seu construtor privado, assim ninguém poderá instanciar a Classe diretamente e deixar o padrão Singleton cuidar disso.
  2. Você precisará também de um atributo publico e estático do mesmo tipo da Classe que você está utilizando. Como o PHP é uma linguagem não tipada, não precisamos definir nenhum tipo para o atributo “instance”, mas no caso do Java você precisaria definir o tipo.
  3. É no método "getInstance()" que toda mágica acontece, e você perceberá o quão simples é a aplicação do Singleton. Ele simplesmente verifica se a variável “instance” já foi criada, ou seja, se seu valor não é nulo, assim sendo ele apenas retorna a variável para o método que a chamou, caso a variável for nula, significa que esta classe ainda não foi instanciada nenhuma vez, e o própria getInstance() chama o construtor da classe, criando a primeira e única instancia da classe durante toda a aplicação.
  4. Toda vez chamarmos a classe que tem um padrão Singleton, devemos fazer: "MinhaClasse::getInstance()". Só em fazer isso, já estamos dizendo: "Quero que você me retorne essa Classe no padrão Singleton que foi implementado".

O Singleton previne que você crie uma nova instancia da Classe diretamente, usando a palavra reservada "new", isso porque você definiu o construtor da classe como PRIVATE. Mas aqui entra uma questão para quem está iniciando com padrões de projeto, quem me impediria de não definir o construtor como private, ou mesmo usar o nome getInstance() na minha classe? A resposta é curta e direta: Ninguém.

Caso você queira implementar um padrão de projeto, mas prefere fazer do seu "modo", podemos chamar de tudo, menos padrão de projeto. Imagine se você utiliza um Framework que cria suas classes Singleton automaticamente, e para isso chama sempre o método getInstance() (que é o padrão), mas você decidiu implementar pegarInstancia() ou criarApenasUmaVez(), simplesmente o seu framework não funcionaria.

Na figura abaixo temos uma definição simples e ao mesmo tempo completa do padrão singleton, isso porque apenas nessa imagem definimos todo o funcionamento da mesma.

Implementação do Padrão Singleton

Figura 1: Implementação do Padrão Singleton

Com isso fechamos este artigo e bom uso dos Padrões de Projeto!

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?