Usando
singletons
em PHP é considerado má prática. Pela minha experiência, o problema mais problemático com eles são os testes de unidade. É difícil garantir que dois testes sejam independentes ao testar singletons. Eu delegaria a responsabilidade pela restrição "somente uma instância deveria existir" ao código que cria o objeto Db.
Também para mim, parece que há um mal-entendido em como os Singletons funcionam em PHP em contraste com outras linguagens:Se você tiver 10.000 solicitações simultâneas, por exemplo, cada solicitação será executada em um processo ou thread PHP separado, o que significa que todos terão seus próprios instância do "singleton", não há compartilhamento deste objeto para mais de uma única solicitação (ao executar PHP em cenários comuns de back-end da web)
Não há "pooling de conexões" em PHP, mas você pode usar
mysqli
conexões persistentes para mysql. Isso pode ser alcançado passando o p:
na frente do nome do host ao criar mysqli. Isso pode ajudar aqui, mas trate com cuidado (o que significa que leia a documentação primeiro ) No entanto, apenas para teoria, um singleton em PHP deve estar ciente do fato de que alguém pode usar
clone
. Ou seja, no seu caso, seria possível fazer isso:$db = DB::getInstance();
$db2 = clone $db;
Para evitar isso, você pode implementar o
__clone()
método assim:public function __clone() {
throw new Exception("Can't clone a singleton");
}