Не получается класс одиночки в php
Решил сделать так, чтобы при обращении к базе данных создавался только один экземпляр класса. Изучил тему одиночки, сделал всё, как написано в туторе.
Код класса такой:
<?php
namespace Jumpers;
class Singleton
{
private static $instances = [];
protected function __construct() { }
protected function __clone() { }
public function __wakeup()
{
throw new \Exception("Cannot unserialize singleton");
}
public static function getInstance()
{
$subclass = static::class;
if (!isset(self::$instances[$subclass])) {
self::$instances[$subclass] = new static();
}
return self::$instances[$subclass];
}
}
class Db extends Singleton
{
protected $db = null;
public function __construct()
{
$this->db = new \mysqli("localhost", "mysql", "mysql", "jumpers");
file_put_contents('log.txt', date("Y-m-d H:i:s") . " создан экземпляр db\n", FILE_APPEND);
// здесь я тестирую вызовы добавлением строк в log.txt
}
public static function query($string)
{
$instance = static::getInstance();
return $instance->db->query($string);
}
}
Во всех прочих классах, которые обращаются к базе, убрал лишние создания $this->db = new Db(). Для момента вызова заменил $this->db->query($query) на Db::query($query)
Пример функции, где есть вызов:
public function checkTrophyAchieve($trophyId = 0)
{
if ($trophyId == 0) {
$trophyId = $this->trophyId;
}
$query = "SELECT * FROM `user_trophies` WHERE user_id = {$this->userId} AND trophy_id = {$trophyId};";
$test = Db::query($query);
$result = $test->fetch_all(MYSQLI_ASSOC);
return current($result)['achieved'];
}
До создания одиночки у меня при открытии index.php создавалось 8 экземпляров класса. Теперь создается 4. Это уже что-то! Но я хочу, чтобы создавался только 1, потому что видимых причин для создания большего количества экземпляров нет.
2021-03-27 10:33:37 создан экземпляр db
2021-03-27 10:33:39 создан экземпляр db
2021-03-27 10:33:39 создан экземпляр db
2021-03-27 10:33:39 создан экземпляр db
Есть ли в классе одиночки ошибка? Или мне искать проблему где-то еще?