2017-01-06 40 views
0

我有一个“静态”类,它连接到数据库并具有各种功能。目前基地布局如下:PHP - 静态数据库连接类的良好设计模式

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()。但是,正如您所看到的,我不得不在每个方法开始时都进行初始化。这是一种很好的编码习惯吗?有更好的设计模式吗?起初我想到了建筑模式,但在我看来这并不适合。

+0

使用原则。你正在尝试的都已经完成了,更好的和更好的开发人员比我更好:) – Aerendir

+0

此代码是否可编译/可运行?你可以在静态方法中调用实例方法吗? Anw,使用这样的静态类/方法可能是反模式。测试其他使用Db类的类是很困难的。 – Kata

+0

@Kata我不好,忘了''静态'关键字那里,而我是“绝缘”的代码。谢谢@Aerendir,将研究它 – Hoobla

回答

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(); 

一般情况下,我劝阻全局状态,但我不得不更多地了解你的应用程序知道,如果它在你的情况下,适当的。

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 db连接打开。