Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Padrão de classe MySQLi para conexão, fechar, deixar aberto?


Considero que não é uma boa prática. Isso ocorre especialmente por um motivo:o problema que você descreve por que acha que precisa dele:apenas uma conexão por solicitação.

Você não precisa codificar nada. mysqli tem um bom recurso embutido, a conexão padrão. Ele escolhe os parâmetros de conexão do banco de dados das configurações ini (configuração) cada vez que você cria uma nova instância:
$db = new mysqli;

Como todas as conexões de banco de dados são fechadas quando o script termina, não há muito com o que se preocupar. A única coisa que você precisa fazer é instanciar a conexão uma vez e passar a variável para todo o código que precisa desse mysqli objeto.

Outra prática ruim é que você está introduzindo um Singleton aqui, algo como:
class MysqliSingleton extends mysqli
{
    private static $instance;
    /**
     * @return MysqliSingleton
     */
    public function getInstance()
    {
        if (NULL === self::$instance)
            self::$instance = new self();
        return self::$instance;
    }
    private function __construct()
    {
    }
    public function __clone()
    {
         throw new RuntimeException('Clone is not allowed.');
    }
    public function __wakeup()
    {
        throw new RuntimeException('Unserializing is not allowed.');
    }
}

Funcionaria assim:
$mysqli = MysqliSingleton::getInstance();

e sempre retornaria aquela instância do mysqli, que pode ser o que você está procurando. No entanto, Singletons são considerados prejudiciais, pois podem apresentar muitos problemas, consulte a pergunta relacionada Quem precisa de singletons? .

É mais fácil você mesmo criar uma variável que você passará contendo a instância do banco de dados. Você também pode encapsular algum tipo de carregamento lento caso seu aplicativo nem sempre precise de uma conexão mysqli, por exemplo. com uma classe de contexto muito simples:
interface ContextMysqli
{
    /**
     * @return mysqli
     */
    public function getMysqli();
}

class Context implements ContextMysqli
{
    private $mysqli;
    public function getMysqli()
    {
        $this->mysqli || $this->mysqli = new mysqli();
        return $this->mysqli;
    }
}

Quando seus scripts forem iniciados, basta instanciar seu contexto e passá-lo para todas as partes do seu código onde você precisar:
$context = new Context();
...
$result = do_some_db_work($context);
...
function do_some_db_work(ContextMysqli $context)
{
    $mysqli = $context->getMysqli();
    ...
}

Esta sugestão pode ser um pouco míope também, mas é melhor do que um singleton sem introduzir muito barulho. O benefício é que você encapsulou a lógica quando criar o mysqli objeto sem a necessidade de um singleton. Seu código agora é independente do contexto global ou estático.