在PHP应用程序中使用db连接

时间:2012-03-29 22:47:42

标签: php database class mysqli

我有db类,看起来像

class db {

    protected $db;

    public function __construct() {
        $this->connect();
    }

    protected function connect() {
        $this->db = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->db->error);
        $this->db->set_charset('utf8');
    }

}

我的PHP应用程序中的每个类都扩展了这个db类

class registration extends db {

    var $validation;

    function __construct() {
        parent::__construct();
        $this->validation = new validation();
...

验证看起来像那样

class validation extends db {

    var $ajax, $common;

    function __construct() {
        parent::__construct();
...

获取错误消息“连接太多”。我觉得,这不是正确的方法:我每次都重新连接到db。那么你认为什么是正确的方式?是否可以定义('db',...)1次并在app中随处使用?

2 个答案:

答案 0 :(得分:1)

registrationvalidation使用 db的类,但不是它的子类。

您的代码应如下所示:

$db = new DB();
$db->connect();
$registration = new Registration($db);

class Registration {

    private $db;

    public function __construct(DB $db) {
        $this->db = $db;
        ...

$db实例的引用传递给所有需要它的类。

您打开太多连接的原因可能是因为当前每个类都与您的数据库建立了自己的连接,而这不是您想要做或不想做的事情。

答案 1 :(得分:0)

您想在此处使用合成。也可以考虑调查Singleton模式。

为了详细说明,使用合成,库中的每个类都有<{1}}类的实例,而不是是<{strong>的{/ strong>实例}。class。

Singleton将使db类强制只创建一个类的实例,这对数据库连接等共享资源很有用。请查看此链接以进一步阅读该主题。

http://php.net/manual/en/language.oop5.patterns.php

编辑:添加一些代码

将db类转换为Singleton

db

修改其余类以编写db实例,而不是扩展db类

db