PHP - 静态数据库连接类的良好设计模式

时间:2017-01-06 00:27:53

标签: php design-patterns

我有一个"静态"连接数据库并具有各种功能的类。当前的基本布局如下:

class DB {

    private static $con;

    private function __construct() {};

    private static function init() {
        if(is_null(self::$con) {
            // Initialize database connection
        }
    }

    public static someMethod1() {
        self::init();
        // Do stuff
    }

    public static someMethod2() {
        self::init();
        // Do stuff
    }

    public static someMethod2() {
        self::init();
        // Do stuff
    }
}

我的目的是能够轻松地将这些方法称为:DB::someMethod1()。但是,正如您所看到的,我不得不在每个方法开始时进行初始化。这是一个很好的编码实践吗?有更好的设计模式吗?最初我想到了建造者模式,但在我看来,这并不适合这里。

2 个答案:

答案 0 :(得分:0)

看起来您正在尝试确保您的数据库类只有一个实例,并且该实例可作为单个全局可用常量使用。

我建议将这两个问题分开,以简化实施。

首先,我专注于正确获取数据库访问对象。与静态函数相比,普通对象更容易测试和注入依赖项。例如,

class DBThing
{
    private $con;

    public static function build()
    {
        return new static('theconnection');
    }

    function __construct($con)
    {
        $this->con = $con;
    }

    public function someMethod1()
    {
        echo "someMethod1: $this->con\n";
    }

    public function someMethod2()
    {
        echo "someMethod2: $this->con\n";
    }

    public function someMethod3()
    {
        echo "someMethod3: $this->con\n";
    }
}

为您提供一个对象,您可以根据需要轻松地测试和替换替代实现。

其次,我专注于对象生命周期并使其在应用程序中被发现。

如果您对单个实例以及暗示的全局状态感到满意,那么这样的事情会让您接近原始帖子中要求的界面。

$DB = DBThing::build();

$DB->someMethod1();
$DB->someMethod2();
$DB->someMethod3();

总的来说,我不鼓励全球国家,但我必须更多地了解您的申请,以了解您的情况是否合适。

答案 1 :(得分:0)

我刚为编码测试编写了一个简单的db类。看看我在这里使用的方式:https://github.com/TheRealJAG/Valuation-Vision-Full-Stack-Test/blob/master/classes/db.php

class DB
{
    private static $instance = null;
    private $db;
    private $host = '';
    private $username = '';
    private $password = '';
    private $database = '';

    private function __construct()
    {
        $this->db = new mysqli($this->host, $this->username, $this->password, $this->database);
        if ($this->db->connect_error) {
            throw new Exception("Connection to the mysql database failed: " . $this->db->connect_error);
        }
    }

    public static function connection()
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance->db;
    }
}

我100%在这种方法上卖出,但是我有时间参加测试,这就是我写的。我最担心的是我只打开了1个数据库连接。