Не получается класс одиночки в 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

Есть ли в классе одиночки ошибка? Или мне искать проблему где-то еще?


Ответы (0 шт):