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

时间:2018-08-12 14:29:25

标签: php singleton

在Database类(必须使用单调模式创建)中创建查询功能是一种好习惯。还是最好用数据库接口或类似的方法创建另一个类,并在构造函数中获取数据库实例? (对不起,我的英语:)

<?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() { }
}
?>

1 个答案:

答案 0 :(得分:2)

这是一个非常广泛的主题,无论它是否是好的做法。至于我,可能会有一些观点。

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

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

但是,此决定还取决于项目的大小和目标。如果您只是想让所有事情都做对,而不是发明自己的全新自行车,只需采用Symfony或Laravel之类的框架,而忽略这些低级的东西。