Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQLi-Klassenmuster für Verbindung, schließen, offen lassen?

Ich würde es nicht als gute Praxis bezeichnen. Das ist vor allem aus einem Grund:das Problem, das Sie beschreiben, warum Sie denken, dass Sie es brauchen:Nur eine Verbindung pro Anfrage.

Du musst nichts codieren. mysqli hat eine nette eingebaute Funktion, die Standardverbindung. Jedes Mal, wenn Sie eine neue Instanz erstellen, wählt es die Datenbankverbindungsparameter aus den INI-Einstellungen (Konfiguration) aus:

$db = new mysqli;

Da alle Datenbankverbindungen geschlossen werden, wenn das Skript beendet ist, gibt es überhaupt nicht viel zu beachten. Das Einzige, was Sie tun müssen, ist, die Verbindung einmal zu instanziieren und die Variable an den gesamten Code weiterzugeben, der dieses mysqli benötigt Objekt.

Eine weitere schlechte Praxis ist, dass Sie einen Singleton hier so etwas wie:

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

Das würde so funktionieren:

$mysqli = MysqliSingleton::getInstance();

und würde immer diese eine mysqli-Instanz zurückgeben, die möglicherweise das ist, wonach Sie suchen. Allerdings Singletons gelten als schädlich, da sie viele Probleme verursachen können, siehe die verwandte Frage Wer braucht Singletons? .

Einfacher ist es, wenn Sie sich selbst eine Variable erstellen, die Sie herumreichen und die die Datenbankinstanz enthält. Sie können zusätzlich eine Art Lazy-Loading kapseln, falls Ihre Anwendung nicht immer eine MySQL-Verbindung benötigt, z. mit einer sehr einfachen Kontextklasse:

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

Wenn Ihre Skripte starten, instanziieren Sie einfach Ihren Kontext und übergeben Sie ihn an jeden Teil Ihres Codes, wo Sie ihn brauchen:

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

Dieser Vorschlag ist vielleicht auch etwas kurzsichtig, aber er ist besser als ein Singleton, ohne viel Aufhebens zu machen. Der Vorteil besteht darin, dass Sie die Logik zum Erstellen von mysqli gekapselt haben Objekt ohne die Notwendigkeit eines Singletons. Ihr Code ist jetzt unabhängig vom globalen oder statischen Kontext.