类扩展dbConnection类VS将PDO dbConnection变量传递给类构造函数

时间:2013-08-14 19:31:55

标签: php database pdo connection extends

我曾经在每个需要连接数据库的类中扩展Db连接类。我认为这是最常见的方式。但是,通过这种方式,您可以在扩展db连接类的每个类实例中打开和关闭新连接。最近,我认为我可以创建一个pdo对象并将其传递给类的构造函数。因此,每个需要访问数据库的类实例都使用相同的连接。它有效,但我不确定这是否是一种有效的方法。此外,我有一个名为closeCon的函数,我在脚本的末尾调用,以便通过null和unset关闭连接。我也想知道你对此的看法。提前谢谢你:)

方法1:新类扩展了dbConnection类。

class Db {

    public $pdo;

    public function __construct($usr, $pwd, $db) {

        $this->pdo = new PDO("mysql:host=localhost;dbname=".$db.";charset=utf8", $usr, $pwd);
    }
}

class Users extends Db{

    public function __construct(){

        parent::__construct($usr, $pwd, $db);
    }
}

方法2:通过将PDO dbConnection变量传递给新类的构造函数来连接到db。

class Db {

    public $pdo;

    public function __construct($usr, $pwd, $db) {

        $this->pdo = new PDO("mysql:host=localhost;dbname=".$db.";charset=utf8", $usr, $pwd);
    }

    public function closeCon(){

        $this->pdo = null;
        unset($this->pdo);
    }
}

class Users {

    protected $pdo;

    public function __construct($con){

        $this->pdo = $con;
    }
}

$db = new Db($usr, $pwd, $db);

$posts = new Users($db->pdo);

$db->closeCon();

3 个答案:

答案 0 :(得分:1)

从DB类扩展应用程序类绝对没有意义。所以 - 计划B。

答案 1 :(得分:1)

方法1 可能的唯一情况是Users是模型。但是,由于耦合,多重继承限制等原因,这种方法通常是不好的做法。在您的情况下,会创建多个数据库连接。

方法2,是两者中更好的方法。它是dependency injection的一种形式。

答案 2 :(得分:-2)

干得好。这比每次打开连接更有效,并且在完成后正确处理连接。