sql >> Databáze >  >> RDS >> Mysql

Vzor třídy MySQLi pro připojení, zavřít, nechat otevřené?

Nepovažoval bych to za dobrou praxi. Je to zejména z jednoho důvodu:problém, který popisujete, proč si myslíte, že jej potřebujete:Pouze jedno připojení na požadavek.

Nemusíte nic kódovat. mysqli má vestavěnou pěknou funkci, výchozí připojení. Pokaždé, když vytvoříte novou instanci, vybere parametry připojení k databázi z nastavení ini (konfigurace):

$db = new mysqli;

Protože všechna databázová připojení se po dokončení skriptu uzavřou, není se o co starat. Jediné, co musíte udělat, je jednou vytvořit instanci připojení a předat proměnnou všemu kódu, který potřebuje mysqli objekt.

Dalším špatným postupem je, že zavádíte Singleton tady něco jako:

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

Fungovalo by to takto:

$mysqli = MysqliSingleton::getInstance();

a vždy vrátí tu jednu instanci mysqli, což může být to, co hledáte. Nicméně Singletons jsou považovány za škodlivé, protože mohou způsobit mnoho problémů, viz související otázka Kdo potřebuje singletony? .

Je snazší, když si sami vytvoříte proměnnou, kterou předáte a která obsahuje instanci databáze. Můžete dodatečně zapouzdřit nějaký druh líného načítání pro případ, že vaše aplikace nepotřebuje vždy připojení mysqli, např. s velmi jednoduchou kontextovou třídou:

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

Když se vaše skripty spustí, stačí vytvořit instanci vašeho kontextu a předat jej každé části kódu tam, kde to potřebujete:

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

Tento návrh může být také trochu krátkozraký, ale je lepší než singleton, aniž by zaváděl mnoho povyku. Výhodou je, že jste zapouzdřili logiku, kdy vytvořit mysqli objekt bez potřeby singletonu. Váš kód je nyní nezávislý na globálním nebo statickém kontextu.



  1. Co může způsobit nečinnost v transakci u příkazů BEGIN

  2. XmlHTTPRequest:Chyba analýzy XML:nenalezen žádný prvek

  3. jak vytvořím geometrii kruhu s poloměrem a souřadnicemi středu pomocí MySQL Spatial Extensions?

  4. Jak aktualizovat sloupec TIMESTAMP na TIMESTAMP WITH TIME ZONE v Oracle