sql >> Base de Datos >  >> RDS >> Mysql

¿Patrón de clase MySQLi para conexión, cerrar, dejar abierto?

Consideraría que no es una buena práctica. Eso es especialmente por una razón:el problema que describe por qué cree que lo necesita:solo una conexión por solicitud.

No necesitas codificar nada. mysqli tiene una buena función incorporada, la conexión predeterminada. Selecciona los parámetros de conexión de la base de datos de la configuración ini (configuración) cada vez que crea una nueva instancia:

$db = new mysqli;

Como todas las conexiones de la base de datos se cierran cuando finaliza el script, no hay mucho de qué preocuparse. Lo único que debe hacer es instanciar la conexión una vez y pasar la variable a todo el código que lo necesite mysqli objeto.

Otra mala práctica es que estás introduciendo un Singleton aquí, 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.');
    }
}

Funcionaría así:

$mysqli = MysqliSingleton::getInstance();

y siempre devolvería esa instancia mysqli, que podría ser lo que está buscando. Sin embargo Solteros se consideran dañinos, ya que pueden presentar muchos problemas; consulte la pregunta relacionada ¿Quién necesita singletons? .

Es más fácil que usted mismo cree una variable que pase y contenga la instancia de la base de datos. Además, puede encapsular algún tipo de carga diferida en caso de que su aplicación no siempre necesite una conexión mysqli, p. con una clase de contexto muy simple:

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;
    }
}

Cuando comiencen sus scripts, simplemente cree una instancia de su contexto y páselo a cada parte de su código donde lo necesite:

$context = new Context();
...
$result = do_some_db_work($context);
...
function do_some_db_work(ContextMysqli $context)
{
    $mysqli = $context->getMysqli();
    ...
}

Esta sugerencia también puede ser un poco miope, pero es mejor que un singleton sin introducir mucho ruido. El beneficio es que ha encapsulado la lógica cuando se crea el mysqli objeto sin la necesidad de un singleton. Su código ahora es independiente del contexto global o estático.