PHP:正确使用单例模式?

Ind*_*ial 2 php oop singleton design-patterns

我正在尝试学习PHP OOP,并对如何在我的项目中使用全局数据库类进行了一些研究.从我所看到的,最合适的模式是一个单例,它可以确保始终只存在一个数据库连接.然而,由于这是我第一次使用Singleton模式,我不确定我是否做得对.

这是一个合适的单身人士吗?此代码是否仅确保一个数据库连接?有什么办法可以测试吗?(学会钓鱼的人,他将在余生中获得食物......)

我使用redbean作为我的ORM,这是我如何明确地设置它:

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

我已经基于这个源创建了以下脚本,作为我自己的单例数据库类;

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

sup*_*ova 6

实例变量需要是类的静态成员.我没有测试过这段代码,但它应该可行.连接也应该是静态的.使用此代码,您将拥有一个数据库类实例和一个连接实例.可以在没有静态连接的情况下执行此操作,但将其设置为静态将确保只有一个连接实例.我还将类的文字名称更改为php magic constants.这使您的代码更易于维护.如果您在路上更改班级名称,则无需在代码中查找旧班级名称的所有文字实例.现在看起来似乎有些过分,但相信我,当你在越来越复杂的项目上工作时,你会欣赏它的价值.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @industrial,将使用 - >调用连接方法,因为该方法不是静态的.作为php中的规则,如果要访问静态的变量或方法,则需要使用范围解析运算符(::),无论您是在类的内部还是外部.如果要访问非静态类成员或函数,请使用箭头运算符( - >).希望有帮助,如果没有,请告诉我,我可以进一步澄清. (2认同)