我有一个"静态"连接数据库并具有各种功能的类。当前的基本布局如下:
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 :(得分: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个数据库连接。