Série Design Patterns com PHP: I - Singleton
por Adler Medrado

Primeiro artigo da série Design Patterns com PHP, visa mostrar o conceito do padrão singleton com PHP5.




O que é design pattern?
São formas de se escrever código de programação utilizando conceitos de melhores práticas de programação que visam mostrar soluções para problemas comuns no desenvolvimento de software.

O que é o singleton?
É um padrão de design de software (Design Pattern) que garante a existência
de uma única instância de uma classe, permitindo um acesso global a esta instância.

Quando é necessário utilizar?
Muitos projetos necessitam de classes que sejam instanciadas apenas uma vez, por exemplo:
Classes de Logging, conexão com banco de dados, entre outras.

Quais os pre-requisitos para se aproveitar melhor este artigo?
Conhecimento dos conceitos de programação orientada a objetos.
Conhecimentos das funcionalidades OO do PHP5.


Vendo na prática como funciona:

Primeiramente, os membros e métodos da nossa classe que serão utilizados tem de ser estáticos, ou seja, podem ser chamados de fora do contexto de uma instância da classe.
Com isso em mente iremos criar uma classe de exemplo que abre uma conexão com um banco de dados mySQL.


<?php 
class Conexao {
    
public static $instance;
    
    
/*
     * Colocando o constructor como private impede que a classe seja instanciada.
     */
    
private function __construct() {
        print 
'Sou o constructor da classe '.__CLASS__.' e esta classe não deve ser instanciada.';
    }

    
public static function singleton() {
        if (!isset(
self::$instance) {
        
// Você deve informar os dados para conexão com o banco de dados.
            
self::$instance = new mysqli($host,$user,$password,$db);
        } 
        return 
self::$instance;
    }
}
?>


Como vemos, nós definimos como estáticos a propriedade $instance e o método singleton(), com isso poderemos acessá-los independentemente da classe ter sido instanciada ou não.
Os nomes $instance e $singleton são convenções, não tendo nenhuma interferência na funcionalidade do pattern.

A classe acima poderia ser utilizada da seguinte forma:


<?php 
$conexao 
Conexao::singleton();
$conexao->query($sql);
?>


Nós recuperamos uma instância da conexão com o banco de dados, executando a função singleton da classe Conexao, estaticamente, utilizando '::' e se tentássemos instanciar a classe Conexao, nós teríamos um erro gerado porque o construtor da classe foi definido como private, ou seja, só pode ser acessado de dentro da própria classe.

Nota-se que dentro da classe, nós trabalhamos com a propriedade $instance da mesma forma, por meio da palavra chave self, que indica que estamos utilizando um membro estático da classe.

Um membro estático de uma classe não pode ser chamado via $this como é comumente feito devido ao fato de ele ser um membro da classe e não um membro da instância da classe.

Caso não existisse nenhuma instância anterior do objeto mysqli ( if (!isset(self::$instance) ) uma instância seria criada e logo em seguida retornada pelo método, caso contrário, a mesma instância criada anteriormente seria retornada.

Ao ter o objeto de conexao, manipulamos ele normalmente utilizando seus proprios métodos.


Considerações finais:
A utilização do pattern singleton permite uma facilidade maior no controle das classes que não devem ser instanciadas mais do que uma vez.

Normalmente uma classe singleton é utilizada em conjunto com uma classe factory, que será o pattern que iremos ver na próxima semana.

Espero que tenha sido útil.
Caso deseje entrar em contato, pode faze-lo através do email: adler@neshertech.net