@deepin

Соблюдено ли понятие — синглтон?

protected static $instance;

    public function __construct()
    {
        if (self::$instance === null) {
            $db = require_once ROOT . '/config/config_db.php';
            self::$instance = new \PDO($db['dsn'], $db['user'], $db['pass'], [
                \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
                \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ
            ]);
        }
        return self::$instance;
    }
  • Вопрос задан
  • 180 просмотров
Решения вопроса 3
mad_maximus
@mad_maximus
Нет. У вас публичный конструктор, вы не реализовали магические методы __clone, __wakeup и многое другое.
Ответ написан
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
Нет. Синглтон ограничивает создание новых объектов изменением области видимости конструктора. А само создание выносится в статический метод этого класса.
Ответ написан
php666
@php666
PHP-макака
Подключение к БД не нужно оборачивать сингелтоном. Подключений может быть много, к разным базам.
Сингелтоном должно быть только то, что в принципе невозможно быть более чем в одном экземпляре, например объект http-запроса, http-ответа. Или какой-нибудь реестр приложения, в который, кстати, можно и запихнуть объект подключения к БД.

В большинстве случае сингелтон - это костыль, который многие пишут чисто как автор, а причина простая - отсутствие архитектуры приложения.

Я бы сделал сингелтоном некий реестр. Потом так:

Registry::getInstance()->setDefaultDatabase(
    "its_my_default_database_name", 
    new \PDO($db['dsn'], $db['user'], $db['pass'], [])
);
Registry::getInstance()->getDefaultDatabase()->query(/*...*/);

Можно сделать также метод для вспомогательных подключений:
Registry::getInstance()->setDatabase(
    "its_my_other_database_name", 
    new \PDO($db['dsn'], $db['user'], $db['pass'], [])
);

теперь в реестре все подключения:
Registry::getInstance()->getDatabase("its_my_other_database_name")->query(/* ... */);

Registry::getInstance()->getDatabase("its_my_default_database_name")->query(/* ... */);
// или
Registry::getInstance()->getDefaultDatabase()->query(/*...*/);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы