PDO – conexão seguindo padrão Singleton no PHP

Conexão PDO SingletonO tema do artigo de hoje será a construção de uma classe de conexão com PDO com um banco de dados MySQL baseado no padrão de projeto Singleton.
 
Primeiramente vamos falar um pouco sobre o mysql_  no PHP, pessoalmente não gosto dessa biblioteca, tenho visto muitas vídeo-aulas, artigos e até cursos presenciais utilizando a biblioteca mysql_ para realizar conexões, consulta e manipulações de dados junto ao SGBD MySQL. Pessoal essa biblioteca não é mais encorajada a ser utilizada, inclusive já foi lançada uma biblioteca mais recente mysqli_ que trouxe alguns recursos a mais, visto que o MySQL evoluiu muito desde a sua versão 5.1 (atualmente estamos na versão 5.6) e com isso as funções mysql_ acabaram ficando defasadas.
 
Já o PDO é uma biblioteca do PHP escrita em C, orientada a objetos e apresenta um bom ganho de performance em relação as bibliotecas mysql_ e mysqli_, além de inúmeras funcionalidades as quais podem ser estudadas no site oficial do PHP http://www.php.net/manual/pt_BR/book.pdo.php.
 
Agora vamos falar sobre padrões de projeto, mais precisamente sobre o Singleton. Esse padrão tem como objetivo garantir que exista apenas uma instância de uma determinada classe e também definir um ponto de acesso global a essa instância. Basicamente quem gerencia o objeto é ele mesmo, ou seja, sempre que for necessário instanciar uma novo objeto de uma determinada classe quem irá definir a necessidade ou não de se instanciar esse objeto é a própria classe através de um método estático getInstance(). Outro ponto importante é que essa classe deve possuir seu método construtor como privado, dessa maneira a mesma não poderá ser instanciada diretamente por outras classes, pois seu método getInstance() é quem verifica se já existe um objeto dessa classe na memória e caso exista ele retorna esse mesmo objeto.

Post relacionado:  5 funções do PHP para trabalhar com data e hora que você precisar conhecer!

 

Observação: Essa classe é um pouco diferente dos vários exemplos que existem na WEB, na maioria dos scripts a classe Conexao estende a classe PDO, mas dessa maneira não é possível esconder o construtor da classe (uma das característica do padrão Singleton) uma vez que o PDO disponibiliza um construtor público então seriamos obrigado a também tornar o construtor da classe Conexao público. Nessa classe eu tenho um atributo $pdo estático e controlo ele no método getInstance() que acaba sendo um ponto de acesso global ao objeto PDO, como não existe um construtor público não existe a possibilidade da classe Conexao ser instanciada. 

Bom vamos ao código…

Conexao.php

 

Detalhes da classe de conexão com PDO

Nesse exemplo usei as constantes do PHP para definir os dados de conexão com o banco de dados, HOST, DBNAME, CHARSET, USER e PASSWORD, mas os mesmos podem ser informados diretamente no momento em que se instância o objeto PDO.
 
Observem o código acima, ele se resume em apenas um atributo estático $pdo o qual vai conter um ponteiro para nosso objeto PDO, um método construtor privado como explicado acima para que a classe não seja instanciada e um método estático getInstance(), esse método é quem verifica a existência de uma instância em memória, caso não exista será instanciado um objeto PDO senão será retornado o objeto já existente. É sempre bom lembrar que atributos estáticos tem seu valor vinculado a classe e não aos objetos instanciados, dessa maneira um valor atribuído será persistido em memória até que seja alterado, independente de quantos objetos dessa classe existirem em memória.

Post relacionado:  Construindo CRUD genérico com PHP e PDO

Um ponto chave para esse script funcionar da maneira desejada é nesse atributo destacado em vermelho que foi informado na array $opcoes:

Setando como TRUE esse atributo estamos informando ao PHP que essa conexão será persistida no pool do servidor mesmo após o final do script onde for chamada a conexão, sendo assim outras chamadas a esse objeto PDO serão reaproveitadas. Assim garantimos que somente uma conexão será realizada, uma vez que só a primeira solicitação irá instanciar um objeto PDO e as demais irão usufruir desse mesmo objeto.

Agora é só chamar o método estático para receber a conexão:

 
Em futuros artigos irei explicar com maior riqueza de detalhes como utilizar o PDO no dia a dia de uma aplicação PHP, com SELECTs, INSERTs, UPDATEs e DELETEs.

 
Bom pessoal até a próxima, abraço !!!
Show Buttons
Hide Buttons