Бих го сметнал за недобра практика. Това е особено поради една причина:проблемът, който описвате, защо смятате, че имате нужда от него:Само една връзка на заявка.
Не е необходимо да кодирате нищо. mysqli
има хубава вградена функция, връзката по подразбиране. Той избира параметрите за връзка с базата данни от настройките на ini (конфигурация) всеки път, когато създавате нов екземпляр:
$db = new mysqli;
Тъй като всички връзки към базата данни се затварят, когато скриптът приключи, изобщо няма какво да ви интересува. Единственото нещо, което трябва да направите, е да установите връзката веднъж и да предадете променливата на целия код, който се нуждае от този mysqli
обект.
Друга лоша практика е, че въвеждате Singleton тук, нещо като:
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.');
}
}
Ще работи по следния начин:
$mysqli = MysqliSingleton::getInstance();
и винаги ще връща този един екземпляр на mysqli, който може да е това, което търсите. Въпреки това Singletons се считат за вредни, тъй като могат да създадат много проблеми, вижте свързания въпрос Кой има нужда от сингълтони? .
По-лесно е да създадете сами променлива, която предавате, съдържаща екземпляра на базата данни. Можете допълнително да капсулирате някакъв вид отложено зареждане, в случай че вашето приложение не винаги се нуждае от mysqli връзка, напр. с много прост контекстен клас:
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;
}
}
Когато вашите скриптове стартират, просто създайте своя контекст и го предайте на всяка част от вашия код, където имате нужда от него:
$context = new Context();
...
$result = do_some_db_work($context);
...
function do_some_db_work(ContextMysqli $context)
{
$mysqli = $context->getMysqli();
...
}
Това предложение също може да е малко късогледо, но е по-добро от единичен, като същевременно не въвежда много шум. Предимството е, че сте капсулирали логиката кога да създадете mysqli
обект без нуждата от сингълтън. Вашият код вече е независим от глобален или статичен контекст.