Sei sulla pagina 1di 3

Srie design patterns com PHP: I - Singleton

Enviado por adlermedrado em Qua, 28/06/2006 - 09:55.PHP O que so design patterns: So formas de se escrever cdigo utilizando conceitos de melhores prticas de programao que visam mostrar solues para problemas comuns no desenvolvimento de software. Quais os pr-requisitos para se aproveitar melhor este artigo: Conhecimento dos conceitos de programao orientada a objetos. Conhecimentos das funcionalidades OO do PHP5. O que o singleton: um padro de design de software (Design Pattern) que garante a existncia de uma nica instncia de uma classe, permitindo um acesso global a esta instncia. Quando necessrio utilizar? Muitos projetos necessitam de classes que sejam instanciadas apenas uma vez, por exemplo: Classes de Logging, conexo com banco de dados, entre outras. Vendo na prtica como funciona: Primeiramente, os membros e mtodos da nossa classe que sero utilizados tem de ser estticos, ou seja, podem ser chamados de fora do contexto de uma instncia da classe. Com isso em mente iremos criar uma classe de exemplo que abre uma conexo com um banco de dados mySQL. 1. 2. class Conexao { 3. 4. public static $instance; 5. 6. /* 7. Colocando o constructor como private impede que a classe seja instanciada. 8. */ 9. private function __construct() { 10. 11. print Sou o constructor da classe .__CLASS__. e esta classe no deve ser instanciada.; 12. 13. } 14. 15. public static function singleton() { 16. 17. if (!isset(self::$instance) { 18.

19. // Voc deve informar os dados para conexo com o banco de dados. 20. 21. self::$instance = new mysqli($host,$user,$password,$db); 22. 23. } 24. return self::$instance; 25. } 26. 27. } 28.

Como vemos, ns definimos como estticos a propriedade $instance e o mtodo singleton(), com isso poderemos acessa-los independentemente da classe ter sido instanciada ou no. Os nomes $instance e $singleton so convenes, no tendo assim, nenhuma interferencia na funcionalidade do pattern. A classe acima poderia ser utilizada da seguinte forma: 1. 2. $conexao = Conexao::singleton(); 3. $conexao->query($sql); 4.

Ns recuperamos uma instncia da conexo com o banco de dados, executando a funo singleton da classe Conexao, estaticamente, utilizando :: e se tentssemos instanciar a classe Conexao, ns teramos um erro gerado porque o construtor da classe foi definido como private, ou seja, s pode ser acessado de dentro da prpria classe. Nota-se que dentro da classe, ns trabalhamos com a propriedade $instance da mesma forma, por meio da palavra chave self, que indica que estamos utilizando um membro esttico da classe. Um membro esttico de uma classe no pode ser chamado via $this como comumente feito devido ao fato de ele ser um membro da classe e no um membro da instncia da classe. Caso no existisse nenhuma instncia anterior do objeto mysqli 1. 2. ( if (!isset(self::$instance) ) 3. uma instncia seria criada e logo em seguida retornada pelo mtodo, caso contrrio, a mesma instncia criada anteriormente seria retornada. Ao ter o objeto de conexao, manipulamos ele normalmente utilizando seus prprios mtodos.

Consideraes finais: A utilizao do pattern singleton permite uma facilidade maior no controle das classes que no 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 prxima semana. Espero que tenha sido til. Caso deseje entrar em contato, pode faze-lo atravs do email adler@neshertech.net Adler Medrado http://adler.neshertech.net

Potrebbero piacerti anche