Mysql
 sql >> Database >  >> RDS >> Mysql

Modello di classe MySQLi per la connessione, chiudi, lascia aperto?

Lo considero non una buona pratica. Questo è soprattutto per un motivo:il problema che descrivi perché pensi di averne bisogno:solo una connessione per richiesta.

Non è necessario codificare nulla. mysqli ha una bella funzionalità integrata, la connessione predefinita. Raccoglie i parametri di connessione al database dalle impostazioni ini (configurazione) ogni volta che crei una nuova istanza:

$db = new mysqli;

Poiché tutte le connessioni al database vengono chiuse al termine dello script, non c'è molto di cui preoccuparsi. L'unica cosa che devi fare è creare un'istanza della connessione una volta e passare la variabile a tutto il codice che ha bisogno di quel mysqli oggetto.

Un'altra cattiva pratica è che stai introducendo un Singleton qui, qualcosa come:

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.');
    }
}

Funzionerebbe così:

$mysqli = MysqliSingleton::getInstance();

e restituirebbe sempre quell'istanza mysqli, che potrebbe essere quello che stai cercando. Tuttavia Singleton sono considerati dannosi in quanto possono introdurre molti problemi, vedere la domanda correlata Chi ha bisogno di singleton? .

È più facile creare da soli una variabile che si passa in giro contenente l'istanza del database. Puoi inoltre incapsulare una sorta di caricamento lento nel caso in cui la tua applicazione non necessiti sempre di una connessione mysqli, ad es. con una classe di contesto molto semplice:

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 i tuoi script iniziano, crea un'istanza del tuo contesto e passalo a ogni parte del tuo codice dove ne hai bisogno:

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

Anche questo suggerimento potrebbe essere un po' miope, ma è meglio di un singleton pur non introducendo molto rumore. Il vantaggio è che hai incapsulato la logica quando crei il mysqli oggetto senza la necessità di un singleton. Il tuo codice è ora indipendente dal contesto globale o statico.