PHP: Является ли реализация уровня базы данных как синглтона приемлемой?Код внутри - PullRequest
3 голосов
/ 18 февраля 2011

Я знаю, что синглтоны плохие.Но разве это тоже плохо для этого?

class DaoMySQL {

    private static $instance;
    private $PDO;

    private function __construct() {
        $this->PDO = new PDO('mysql:dbname='.MYSQL_DEFAULT_DATABASE.';host='.MYSQL_HOSTNAME, MYSQL_USERNAME, MYSQL_PASSWORD);
        $this->PDO->query('SET NAMES \'utf8\'');
    }

    /**
     * @return DaoMySQL
     */
    static public function singleton() {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c();
        }
        return self::$instance;
    }

    /**
     * @return PDO
     */
    public function getPDO() {
        return $this->PDO;
    }

}

Чтобы использовать это, я делаю что-то вроде этого.(Это из моего класса Bean, который расширяет все объекты данных.)

public function delete() {
    $calledClassName = get_called_class();
    $query = "DELETE FROM `" . $calledClassName::table . "` WHERE `id` = $this->id";
    return DaoMySQL::singleton()->getPDO()->exec($query);
}

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

Многие люди начинают использовать контейнеры Dependency Injection для управления своими объектами вместо использования синглетонов.Возможно, стоит посмотреть?Тогда все, что вам нужно, это убедиться, что объекты могут получить доступ к контейнеру.Оттуда вы можете получить все остальное.

Лично я использую sfServiceContainer от Symfony Components.Это автономный DI-контейнер, и он кажется довольно популярным в наши дни.

Обновление

Вам не нужно , чтобы использовать фреймворк или библиотека.Статьи Фабьена Потенциера по внедрению зависимостей должны дать вам достаточно хорошее представление о DI, чтобы реализовать свой собственный.Но зачем изобретать велосипед?Не используется хороший, существующий запах библиотеки NIH .

Обратите внимание, что помимо sfServiceContainer, который я использую, есть много других библиотек DI.Также обратите внимание, что sfServiceContainer - это полностью автономная библиотека.Для этого не нужен Symfony или какой-либо другой фреймворк.Все, что для этого нужно - это старый добрый PHP.

2 голосов
/ 18 февраля 2011

Дело (ну, в общем, одно из них), что не так с Singletons, заключается в том, что приложение должно действительно отвечать за определение жизненного цикла объекта.

Прочитайте статью Стива Йегге Синглтон считается глупым

...