我正在尝试创建一个简单易用的单例类来连接到mysql数据库并执行查询,代码可以正常工作,并且我没有任何问题,但是由于我是OOP的新手,所以我想知道这是否是不是一个坏习惯。

这是类(class)

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);

最佳答案

单例是个坏消息。

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

  • 您最好改用dependency-injection,因为它可以解决上述问题。

    09-06 07:13
    查看更多