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

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.
Conexao.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php /* * Constantes de parâmetros para configuração da conexão */ define('HOST', 'localhost'); define('DBNAME', 'DB'); define('CHARSET', 'utf8'); define('USER', 'root'); define('PASSWORD', '123456'); class Conexao { /* * Atributo estático para instância do PDO */ private static $pdo; /* * Escondendo o construtor da classe */ private function __construct() { // } /* * Método estático para retornar uma conexão válida * Verifica se já existe uma instância da conexão, caso não, configura uma nova conexão */ public static function getInstance() { if (!isset(self::$pdo)) { try { $opcoes = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', PDO::ATTR_PERSISTENT => TRUE); self::$pdo = new PDO("mysql:host=" . HOST . "; dbname=" . DBNAME . "; charset=" . CHARSET . ";", USER, PASSWORD, $opcoes); } catch (PDOException $e) { print "Erro: " . $e->getMessage(); } } return self::$pdo; } } |
Detalhes da classe de conexão com PDO
Um ponto chave para esse script funcionar da maneira desejada é nesse atributo destacado em vermelho que foi informado na array $opcoes:
1 |
$opcoes = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', PDO::ATTR_PERSISTENT => TRUE); |
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:
1 2 3 4 5 6 7 |
<?php /* Require no script contendo a classe */ require_once 'conexao.php'; /* Variável recebendo instância do objeto PDO */ $pdo = Conexao::getInstance(); ?> |