PHP: правильно ли использовать шаблон синглтона? - PullRequest
2 голосов
/ 10 февраля 2011

Я пытался изучить PHP ООП и провел несколько исследований о том, как создать глобальный класс базы данных для использования в моем проекте. Из того, что я видел, наиболее подходящим шаблоном является одноэлементный, который обеспечивал бы постоянное присутствие только одного соединения с базой данных. Однако, поскольку я впервые работаю с шаблоном Singleton, я не уверен, что все сделал правильно.

Это правильный синглтон? Будет ли этот код обеспечивать только одно соединение с базой данных? Есть ли способ проверить это? (Научите человека ловить рыбу, и он будет есть всю оставшуюся жизнь ...)

Я использую redbean в качестве своего ORM, и вот как я его настроил:

require_once PLUGINPATH.'rb.php';
$redbean= R::setup("mysql:host=192.168.1.1;dbname=myDatabase",'username','password');

Я создал следующий скрипт на основе этого источника , как мой собственный одноэлементный класс Database;

class database {
    private $connection = null;

    private function __construct(){
        require_once PLUGINPATH.'rb.php';
        $this->connection = R::setup("mysql:host=192.168.1.1;dbname=myDatabase",'username','password');
    }

    public static function get() {
        static $db = null;

        if ( $db === null )
        $db = new database();

        return $db;
    }

    public function connection() {
        return $this->connection;
    }
}

Спасибо!

Ответы [ 2 ]

6 голосов
/ 10 февраля 2011

Переменная экземпляра должна быть статическим членом класса. Я не проверял этот код, но он должен работать. Соединение должно быть тоже статичным. С этим кодом у вас будет один экземпляр вашего класса базы данных и один экземпляр соединения. Это можно сделать без статического соединения, но, сделав его статичным, вы получите только один экземпляр соединения. Я также изменил буквальные имена класса на магические константы php. Это сделает ваш код более понятным. Если вы измените имя своего класса в будущем, вам не нужно будет искать все буквальные экземпляры старого имени класса в вашем коде. Сейчас это может показаться излишним, но, поверьте мне, поскольку вы работаете над более сложными проектами, вы по достоинству оцените их ценность.

class database {
    private static $connection = null;
    private static $db;

    private function __construct(){
        require_once PLUGINPATH.'rb.php';
        self::$connection = R::setup("mysql:host=192.168.1.1;dbname=myDatabase",'username','password');
    }

    public static function get() {
        if ( !(self::$db instanceof __CLASS__) ) {
            $klass = __CLASS__; // have to set this to a var, cant use the constant with "new"
            self::$db = new $klass();
        }

        return self::$db;
        }

    public function connection() {
        return self::$connection;
    }
}
2 голосов
/ 10 февраля 2011

Ты синглтон, почти правильно.

Приватный член (без каламбура) $connection также должен быть статичным. Вы можете пойти со следующим:

class database {
    private static $instance = NULL;
    protected $conn;

    private function __construct() {
        $this->conn = mysql_connect( ... );
    }

    public static function init() {
        if (NULL !== self::$instance) 
            throw new SingletonException();
        self::$instance = new database();
    }

    public static function get_handle() {
        if (NULL === self::$instance)
            ; // error handling here
        return self::$instance->conn;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...