一尘不染

php单例数据库连接,此代码是不好的做法吗?

mysql

我正在尝试创建一个简单易用的单例类来连接到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);

阅读 251

收藏
2020-05-17

共1个答案

一尘不染

单身人士是个坏消息。

  • 他们将全局状态引入程序。大多数程序员应该熟悉为什么全局状态不好。
  • 它们在单例和使用它的任何类之间引入了紧密的耦合。这意味着您不能在不重用单例的情况下重用有问题的类。
  • 它们使依赖单例的类的单元测试成为问题,因为您无法轻松地用模拟替换单例。
  • 它们鼓励类尝试尝试解决自己的依赖关系的编码方式。这很不好,因为它可以降低有关类具有哪些依赖项的清晰度。
  • PHP具有“无共享”架构,这意味着PHP单身人士根本不是真正的单身人士,任何时候都可以存在多个实例(每个打开的请求一个)。
  • 如果您在以后的某个日期突然发现实际需要的资源不止由单例提供的一种资源,会发生什么?这是比您想象的更常见的情况

您最好改用依赖项注入,因为它可以解决上述问题。

2020-05-17