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

时间:2014-08-16 04:51:25

标签: php dependency-injection

我想问一下,在我们需要的时候,每次都有单个数据库连接实例或者声明是否是好的做法?我有以下两种设计:

这是数据库类:

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

哪种方法更好或更好?如果可能,请提供解释。

2 个答案:

答案 0 :(得分:1)

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

您将遇到的问题是在类的每个构造函数中注入$db对象。那些依赖注入容器可以帮助您。它们的作用是处理创建对象(从而在构造函数中传递依赖项)。

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

答案 1 :(得分:-1)

就我个人而言,我通常喜欢为我的应用程序提供类似的东西,名为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");