Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Thiago Dias_132983

Singleton com PDO

Recommended Posts

Estava estudando um pouco sobre OO e como se conectar ao banco com PDO usando o padrão Singleton, mas fiquei uma uma pequena dúvida:

<?php

include_once('config.php'); //arquivos onde estão as constantes do sistema.

class Conexao extends PDO {
 
    private static $instancia;
 
    public function Conexao($dsn, $username = "", $password = "") {
        // O construtro abaixo é o do PDO
        parent::__construct($dsn, $username, $password);
    }
 
    public static function getInstance() {
        // Se o a instancia não existe eu faço uma
        if(!isset( self::$instancia )){
            try {
                self::$instancia = new Conexao("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS);
            } catch ( Exception $e ) {
                echo "<b>Erro ao conectar </b>{$e->getMessage()}";
                exit ();
            }
        }
        // Se já existe instancia na memória, retorne ela;
        return self::$instancia;
    }
}

Conexao::getInstance();

A conexão foi criada em "Conexao::GetInstance()", mas como faço pra fazer queries no banco de dados?

tentei isso, mas não consegui...

$con = Conexao::getInstance();
$con->query('...');

Agradeço a atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só faltou postar a parte do singleton....

 

Mas ele postou, um Singleton muito mal formulado, mas presente ali em Conexao::getInstance().

 

Fora o fato de que não se usa Singleton com banco de dados e o uso de um construtor estilo PHP 4, ou seja, ao invés de __construct(), o construtor deveria ser privado, os argumentos que seriam passados para o construtor da PDO deveriam ser usados (está usando constantes) e passados no getInstance() (por causa da privatização do construtor).

 

Sem contar envio de output diretamente pela classe, uso abusivo de exit (aqui temos um, mas se se programa desse jeito deve ter exit espalhado pelo código a torto e a direito) e, de menor importância, usar isset() para verificação da presença de instância (um == NULL dá e sobra).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque isso amarra tua aplicação a só poder usar uma única conexão, de um único SGBD, com um único determinado conjunto de credenciais. Se amanhã ou depois você precisar trabalhar com múltiplos bancos, você vai ter que mexer no código e mudar algo que se tivesse feito sem Singleton não existiria.

 

Se você não usar Singleton na conexão e sim pra criar um Registry (pesquise, tem zilhões de implementações), você pode ter N conexões armazenadas as quais você pode usar quando precisar apenas por um nome.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, entendi, mas se for uma aplicação pequena que eu sei que não irá usar vários dbs, posso usar sem problemas?

 

Você pode até salvar a conexão em uma superglobal, que o sistema irá funcionar. Entretanto, isso ainda não quer dizer que é correto.

O tamanho do sistema também não influênciará sobre a coerência da solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Registry é um tipo de aplicação de Singleton?

Vi alguns posts no Stack Overflow dizendo que não, que apenas se parecem por ter uma única instância. Na minha cabeça Registry era "apenas" uma forma de implementar o Singleton.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Registry é um padrão assim como Singleton é outro. Entretanto, Registry pode ser implementado como um Singleton, mas não necessariamente precisa ser um.

 

Diferente do singleton, que é possuir uma instância única e disponibilizar um ponto de acesso global, o registry apenas necessita o ponto de acesso global, para adicionar e/ou remover itens. Não necessariamente necessita ser uma instância única, apenas possuir acesso a um único repositório.

 

 

Apenas a implementação de Registry sendo um Singleton, é a forma mais comum de ser implementada/encontrada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se bem que eu acho difícil um Registry que não seja implementado com Singleton que serve também para evitar o uso de global/$GLOBALS manter a instância.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas um Registry que não fosse Singleton na verdade não seria um DIC (Dependency Injection Container)? :huh:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.