Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Dúvida sobre multiplas instancias do PDO

[04:42] “Vinícius, mas isso me parece normal. Não parece ter nenhuma diferença”, tem duas diferenças, a primeira é: caso eu precise em algum método, da conexão, utilizando essa classe posso receber um (PdoConnection), ou seja, eu sei que vai ser sempre a mesma instância. Agora se meu getInstance devolve um “PDO”, eu vou precisar receber um “PDO”, logo eu não consigo mais garantir que vou ter só uma instância de uma conexão no meu sistema.

Eu não entendi o motivo de "ao devolver o PDO" não existir uma garantia dele ser o mesmo objeto, diferente do que é com a PdoConnection. No caso eu to imaginando o seguinte: se eu substituir a instancia da própria classe na variável $instance pelo objeto PDO (instanciado no método) e devolve-lo no retorno do getInstance() não há garantia dele ser o mesmo objeto em todos os retornos? Se sim (não é garantido ser o mesmo objeto), gostaria de saber qual é o motivo disso acontecer, já que o objeto seria instanciado apenas quando for nulo na classe.

2 respostas
solução!

Olá, Anderson.

Tudo bem?

Quando você cria uma classe Singleton para gerenciar a conexão com o banco de dados, a ideia é garantir que apenas uma instância dessa classe exista durante o ciclo de vida da aplicação. Isso é feito armazenando a instância em uma variável estática dentro da própria classe. No exemplo que você mencionou, a classe PdoConnection estende PDO e controla a criação da instância.

Aqui está um exemplo simplificado para ilustrar:

class PdoConnection extends PDO {
    private static $instance = null;

    private function __construct($dsn, $username, $password, $options) {
        parent::__construct($dsn, $username, $password, $options);
    }

    public static function getInstance($dsn, $username, $password, $options) {
        if (self::$instance === null) {
            self::$instance = new self($dsn, $username, $password, $options);
        }
        return self::$instance;
    }
}

Nesse caso, getInstance() garante que self::$instance seja sempre a mesma instância de PdoConnection.

Agora, se você alterar o método getInstance() para retornar um objeto PDO diretamente, como no exemplo abaixo:

class PdoConnection {
    private static $instance = null;

    private function __construct() {}

    public static function getInstance($dsn, $username, $password, $options) {
        if (self::$instance === null) {
            self::$instance = new PDO($dsn, $username, $password, $options);
        }
        return self::$instance;
    }
}

Aqui, self::$instance ainda é a mesma instância de PDO enquanto self::$instance for null. No entanto, a diferença crucial é que a classe PdoConnection não está mais estendendo PDO, e você está retornando uma instância de PDO diretamente. Isso pode ser confuso porque PdoConnection não é mais um PDO, mas apenas um gerenciador de instâncias de PDO.

A principal diferença está na tipagem e na garantia de que a classe gerenciadora (PdoConnection) é a única responsável por criar e fornecer a instância de conexão. Quando você retorna um PDO diretamente, você perde a capacidade de tipar explicitamente os métodos que dependem de PdoConnection, o que pode levar a problemas de manutenção e entendimento do código.

Espero ter entendido e conseguido ajudar. Qualquer dúvida manda aqui novamente. Bons estudos.

Compreendi agora, muito obrigado por esclarecer!