Есть ли сценарий использования для синглетонов с доступом к базе данных в PHP? - PullRequest
136 голосов
/ 04 января 2011

Я получаю доступ к своей базе данных MySQL через PDO. Я настраиваю доступ к базе данных, и моей первой попыткой было использовать следующее:

Первое, о чем я подумал, это global:

$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'root', 'pwd');

function some_function() {
    global $db;
    $db->query('...');
}

Это считается плохой практикой. После небольшого поиска я получил шаблон Singleton , который

"применяется к ситуациям, в которых должен быть один экземпляр класса."

В соответствии с примером в руководстве мы должны сделать следующее:

class Database {
    private static $instance, $db;

    private function __construct(){}

    static function singleton() {
        if(!isset(self::$instance))
            self::$instance = new __CLASS__;

        return self:$instance;
    }

    function get() {
        if(!isset(self::$db))
            self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd')

        return self::$db;
    }
}

function some_function() {
    $db = Database::singleton();
    $db->get()->query('...');
}

some_function();

Зачем мне этот относительно большой класс, когда я могу это сделать?

class Database {
    private static $db;

    private function __construct(){}

    static function get() {
        if(!isset(self::$db))
            self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd');

        return self::$db;
    }
}

function some_function() {
    Database::get()->query('...');
}

some_function();

Последний работает отлично, и мне больше не нужно беспокоиться о $db.

Как создать класс синглтонов меньшего размера или есть сценарий использования для синглетонов, который мне не хватает в PHP?

Ответы [ 11 ]

1 голос
/ 04 января 2011

Вы ничего не упускаете, насколько я вижу.Пример довольно некорректен.Это имело бы значение, если бы у синглтон-класса были некоторые нестатические переменные экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...