具有单例模式的 PHP 数据库类

dom*_*kyi 5 php singleton

在数据库类中创建查询函数(必须使用单例模式创建)是一个好习惯吗?或者更好地创建另一个带有数据库接口的类,或类似的东西,并在构造函数中获取数据库实例?(对不起我的英语不好 :)

<?php
class Database 
{
    private static $_pdo = null;

    private static function getDatabase() {
        if (self::$_pdo === null) {
            self::$_pdo = new PDO("mysql:host=localhost;dbname=contact_manager", 'root', '');
        }

        return self::$_pdo;
    } 

    public static function query($query, $parameters) {
        Database::_toArray($parameters);
        $query = self::getDatabase()->prepare($query);
        $query->execute($parameters);
        $result = $query->fetchAll(PDO::FETCH_ASSOC);

        return $result;
    }

    private static function _toArray(&$parameters) {
        if (!is_array($parameters)) {
         $parameters = array($parameters);   
        }
    }

    private function __construct() { }
    private function __clone() { }
    private function __wakeup() { }
}
?>
Run Code Online (Sandbox Code Playgroud)

Nik*_*hev 3

这是一个非常广泛的主题,是否是好的做法。对于我来说,可能有一些观点。

  1. 如果您不打算使用另一个数据库扩展您的项目,则应通过相同的接口调用查询 - 这个解决方案是可以的

  2. 如果我们从 SOLID 的角度来看,这是一个错误的决定。根据 SOLID,您必须将数据库连接与查询分开。这是因为 D 原则(依赖倒置)+ S 原则(单一责任)。此外,您还必须定义自己的DatabaseInterface连接,用于将连接Repositories注入到封装数据库查询的类中。

但是,此决定还取决于您的项目规模和目标。如果你只是想让一切都正确,而不是发明自己的全新自行车,只需使用像 Symfony 或 Laravel 这样的框架,然后忘记这些低级的东西。