php单例数据库连接,是这段代码的坏做法


php singleton database connection, is this code bad practice?

我正在尝试创建一个简单易用的singleton类来连接到mysql数据库并进行查询,代码运行良好,我没有遇到任何问题,但由于我是OOP的新手,我想知道这是否是一种糟糕的做法。

这是类

class Database {
private $databaseName = 'dbname';
private $host = 'localhost';
private $user = 'user';
private $password = 'pass'; 
private static $instance; //store the single instance of the database
private function __construct(){
    //This will load only once regardless of how many times the class is called
    $connection = mysql_connect($this->host, $this->user, $this->password) or die (mysql_error());
    $db = mysql_select_db($this->databaseName, $connection) or die(mysql_error()); 
    echo 'DB initiated<br>';
}
//this function makes sure there's only 1 instance of the Database class
public static function getInstance(){
    if(!self::$instance){
        self::$instance = new Database();
    }
    return self::$instance;     
}
public function connect() { 
    //db connection
} 
public function query($query) {
    //queries   
    $sql = mysql_query($query) or die(mysql_error()); 
    return $sql;
}
public function numrows($query) {
    //count number of rows  
    $sql = $this->query($query);
    return mysql_num_rows($sql);
}

}
//Intantiate the class
$database = Database::getInstance();

当我想使用我会做的类:

$query = "SELECT * FROM registrations";
echo $database->numrows($query);
$sql = $database->query($query);
单身汉是个坏消息。
  • 他们将全球状态引入到一个项目中。大多数程序员应该熟悉为什么全局状态不好
  • 它们在singleton和任何使用它的类之间引入了紧密耦合。这意味着如果不重用singleton,就不能重用有问题的类
  • 它们使依赖于singleton的类的单元测试成为问题,因为您无法轻松地用mock替换singleton
  • 它们鼓励类尝试解决自己的依赖关系的编码风格。这很糟糕,因为它会降低类具有哪些依赖关系的清晰度
  • PHP有一个Share Nothing架构,这意味着PHP单实例根本不是真正的单实例,任何时候都可能有多个活动实例(每个打开的请求一个)
  • 如果您在以后的某个日期突然发现您实际上需要由singleton提供的多个资源,会发生什么?这是一种比你想象的更常见的情况

您最好考虑依赖注入,因为它解决了上述问题。

我认为单例对于连接管理器来说可以,但对于连接本身来说不行。

你永远不知道什么时候你需要为你的发展的特定部分建立额外的联系。假设您突然需要添加与远程数据库的同步。

连接管理器(可以管理多个连接)可以是单例连接。连接本身;编号

您的连接管理器还应该能够加载"驱动程序",这样您就可以建立MySQL连接,并且在您需要msSQL、sqLite或其他任何东西的那天,您就可以添加所需的驱动程序。

这个模式很好,因为singleton只适用于当前用户会话。这个决定实际上取决于你的优先级。如果你想为用户提供更快的性能,那么你就想为每个用户提供更多的数据库连接,但如果你想限制数据库受到的冲击,那么单例就给了你一个很好的中间位置。

我听到的关于PHP中Singleton设计模式的唯一积极论点来自一位开发人员,他将Singleton数据库连接与Memcached对象结合起来实现。实际上,我没有机会查看代码和性能,但他能够提出一个连贯的论点。

就我个人而言,我不认为Singleton设计模式与PHP非常相关,PHP在很大程度上是无状态的(正如在每个请求都有一个Singleton之前所指出的那样)。