sql >> Databasteknik >  >> RDS >> Mysql

MySQLi klassmönster för anslutning, stäng, lämna öppen?

Jag anser att det inte är en bra praxis. Det är särskilt av en anledning:problemet du beskriver varför du tror att du behöver det:Endast en anslutning per förfrågan.

Du behöver inte koda någonting. mysqli har en trevlig funktion inbyggd, standardanslutningen. Den väljer databasanslutningsparametrarna från ini-inställningarna (konfigurationen) varje gång du skapar en ny instans:

$db = new mysqli;

Eftersom alla databasanslutningar stängs när skriptet är klart finns det inte mycket att bry sig om alls. Det enda du behöver göra är att instansiera anslutningen en gång och skicka variabeln till all kod som behöver den mysqli objekt.

En annan dålig praxis är att du introducerar en Singleton här, något i stil med:

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

Det skulle fungera så här:

$mysqli = MysqliSingleton::getInstance();

och skulle alltid returnera den där mysqli-instansen, vilket kan vara det du letar efter. Däremot Singlets anses vara skadliga eftersom de kan skapa många problem, se den relaterade frågan Vem behöver singlar? .

Det är lättare att du skapar själv en variabel som du skickar runt som innehåller databasinstansen. Du kan dessutom kapsla in någon form av lazy-loading om din applikation inte alltid behöver en mysqli-anslutning, t.ex. med en mycket enkel kontextklass:

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

När dina skript startar, instansiera bara ditt sammanhang och skicka det till alla delar av din kod där du behöver det:

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

Det här förslaget kan också vara lite kortsiktigt, men det är bättre än en singel samtidigt som det inte introducerar mycket väsen. Fördelen är att du har kapslat in logiken när du ska skapa mysqli objekt utan behov av en singel. Din kod är nu oberoende av globala eller statiska sammanhang.



  1. SQL Server-fel 1934 inträffar på INSERT till tabell med beräknad kolumn PHP/PDO

  2. Hjälp mig förstå skillnaden mellan CLOBs och BLOBs i Oracle

  3. Visa dagens föremål

  4. Nodejs uttrycker och lovar att inte göra vad jag förväntar mig