始终将数据库连接保持在单个实例中是最佳实践吗?


Is it a best practice always keep database connection in a single instance?

我想问是否有一个良好的做法,数据库连接的单一实例或声明新的每次当我们需要?我有如下两种设计:

这是数据库类:

<?php
class Database extends PDO {
    //Variable declaration
    private $host = "localhost";
    private $passwd = "";
    private $username = "root";
    private $dbname = "";
    //Connect to DB when the class construct
    public function __construct($host=NULL, $dbname=NULL, $username=NULL, $passwd=NULL) {
        if(isset($host) && !empty($host)) {
            $this->host = $host;
        }
        if(isset($dbname) && !empty($dbname)) {
            $this->dbname = $dbname;
        }
        if(isset($username) && !empty($username)) {
            $this->username = $username;
        }
        if(isset($passwd) && !empty($passwd)) {
            $this->passwd = $passwd;
        }
        parent::__construct("mysql:dbname=$this->dbname;host=$this->host", $this->username, $this->passwd, NULL);
        parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        parent::setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }
}
?>

方法1依赖注入

<?php
class User {
    private $db;
    public function __construct(Database $db) {
        $this->db = $db;
    }
    //Some update and insert below here
}
class Employee {
    private $db;
    public function __construct(Database $db) {
        $this->db = $db;
    }
    //Some update and insert below here
}
?>

所以,当我想要使用这些类时,我会这样做:

<?php 
    $db = new Database();
    $user = new User($db);
    $user->update($id,$data);
    $emp = new Employee($db);
    $emp->delete($id);
?>

还是其他方式?

方法2:

<?php
class User {
    private $db;
    public function __construct() {
        $this->db = new Database();
    }
    //Some update and insert below here
}
class Employee {
    private $db;
    public function __construct() {
        $this->db = new Database();
    }
    //Some update and insert below here
}
?>

,当我想用它的时候,我会:

<?php  
    $user = new User();
    $user->update($id,$data);
    $emp = new Employee();
    $emp->delete($id);
?>

哪种方法更可取或更好?如果可能的话,给出一个解释。

显然依赖注入方法更好,因为它避免了创建到同一个数据库的多个连接。

您将面临的问题是在类的每个构造函数中注入$db对象。这就是依赖注入容器可以帮助您的地方。它们的作用是处理创建对象(从而在构造函数中传递依赖关系)。

看一下这篇文章:理解依赖注入,它展示了一个使用容器的依赖注入的例子。

就我个人而言,我通常喜欢在我的应用程序中有这样的东西,命名为sql.php,并要求在每个页面的顶部。我非常喜欢这种方法,因为它使更改任何凭据或添加具有不同表名的新变量变得非常容易。也有助于版本控制。

// Vars
$host = "localhost"; // Host name 
$username = "blah"; // Mysql username 
$password = "999999"; // Mysql password 
$db_name = "db"; // Database name 
$main_table = "table11"; // Main CONTENT Storage Table Name
// Connect to server and select database.
mysql_connect($host, $username, $password, $db_name)or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");