Есть ли вариант использования синглтонов с доступом к базе данных в PHP?

Я получаю доступ к своей базе данных 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?

136
задан igorsantos07 21 February 2019 в 05:53
поделиться