Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wzorzec klasy MySQLi do połączenia, zamknięcie, pozostawienie otwarte?

Uważam, że to nie jest dobra praktyka. Dzieje się tak szczególnie z jednego powodu:problem, który opisujesz, dlaczego uważasz, że jest potrzebny:tylko jedno połączenie na żądanie.

Nie musisz niczego kodować. mysqli ma wbudowaną fajną funkcję, domyślne połączenie. Wybiera parametry połączenia z bazą danych z ustawień ini (konfiguracji) za każdym razem, gdy tworzysz nową instancję:

$db = new mysqli;

Ponieważ wszystkie połączenia z bazą danych są zamykane po zakończeniu działania skryptu, nie ma się czym przejmować. Jedyną rzeczą, którą musisz zrobić, jest jednorazowe utworzenie instancji połączenia i przekazanie zmiennej do całego kodu, który potrzebuje tego mysqli obiekt.

Inną złą praktyką jest wprowadzenie Singleton tutaj coś takiego:

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

Działałoby to tak:

$mysqli = MysqliSingleton::getInstance();

i zawsze zwróci tę jedną instancję mysqli, która może być tym, czego szukasz. Jednak Singletony są uważane za szkodliwe, ponieważ mogą powodować wiele problemów zobacz powiązane pytanie Komu potrzebne są singletony? .

Łatwiej jest stworzyć sobie zmienną, którą przekazujesz, zawierającą instancję bazy danych. Możesz dodatkowo zahermetyzować jakiś rodzaj lazy-loadingu w przypadku, gdy Twoja aplikacja nie zawsze potrzebuje połączenia mysqli, np. z bardzo prostą klasą kontekstu:

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

Po uruchomieniu skryptów po prostu stwórz wystąpienie kontekstu i przekaż go do każdej części kodu, w której jest potrzebny:

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

Ta sugestia może i jest trochę krótkowzroczna, ale jest lepsza niż singleton, nie wprowadzając zbyt wiele hałasu. Zaletą jest to, że zawarłeś logikę tworzenia mysqli obiekt bez potrzeby singletona. Twój kod jest teraz niezależny od kontekstu globalnego lub statycznego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLSTATE[42S22]:Nie znaleziono kolumny:1054 Nieznana kolumna „id” w klauzuli „where” (SQL:wybierz * z „utwory”, gdzie „id” =5 limit 1)

  2. Przechowywanie informacji o czasie:wymagana strefa czasowa?

  3. Dynamiczna rozwijana lista dla różnych krajów, stanów, lokalizacji geograficznych?

  4. Wykonaj procedurę składowaną MySQL za pomocą wiersza poleceń

  5. sprawdź dostępność pokoju z SQL