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.