@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;
    }
  • Вопрос задан
  • 170 просмотров
Решения вопроса 3
mad_maximus
@mad_maximus
Нет. У вас публичный конструктор, вы не реализовали магические методы __clone, __wakeup и многое другое.
Ответ написан
usdglander
@usdglander Куратор тега PHP
Yippee 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(/*...*/);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
HTML Academy Санкт-Петербург
от 110 000 до 130 000 руб.
от 55 000 до 80 000 руб.
WACDAQ Москва
от 120 000 руб.
26 авг. 2019, в 01:06
2000 руб./за проект
25 авг. 2019, в 23:48
4000 руб./за проект
25 авг. 2019, в 22:35
1000 руб./за проект