Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP应用程序中到处使用db连接_Php_Database_Class_Mysqli - Fatal编程技术网

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

在PHP应用程序中到处使用db连接,php,database,class,mysqli,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->er

我有一个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');
    }

}
class validation extends db {

    var $ajax, $common;

    function __construct() {
        parent::__construct();
...
我的PHP应用程序中的每个类都扩展了这个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');
    }

}
class validation extends db {

    var $ajax, $common;

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

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

您想在这里使用合成。也可以考虑单模式的研究。

要详细说明,使用组合,库中的每个类将具有
db
类的实例,而不是成为
db
类的实例

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

编辑:添加一些代码

将db类转换为单例

<?php
class db
{
    static private $_oInstance = null;
    protected $db;

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

    static public function getInstance()
    {
        if(self::$_oInstance === null)
            self::$_oInstance = new db();
        return self::$_oInstance();
    }

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

}

你想在这里使用构图。也可以考虑单模式的研究。

要详细说明,使用组合,库中的每个类将具有
db
类的实例,而不是成为
db
类的实例

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

编辑:添加一些代码

将db类转换为单例

<?php
class db
{
    static private $_oInstance = null;
    protected $db;

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

    static public function getInstance()
    {
        if(self::$_oInstance === null)
            self::$_oInstance = new db();
        return self::$_oInstance();
    }

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

}

registration
validation
是使用
db
的类,但不是它的子类

您的代码应该如下所示:

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

class Registration {

    private $db;

    public function __construct(DB $db) {
        $this->db = $db;
        ...
将对
$db
实例的引用传递给所有需要它的类


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

注册
验证
是使用
db
的类,但不是它的子类

您的代码应该如下所示:

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

class Registration {

    private $db;

    public function __construct(DB $db) {
        $this->db = $db;
        ...
将对
$db
实例的引用传递给所有需要它的类


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

是的,
db
类与当前设计基本相同。您只是在更改它与应用程序中其他代码的关系。这种方法的一个“问题”是任何类都可以访问数据库资源。无法连接到第二个数据库。你不能让你的代码使用
db
的子类。依赖注入通常被认为是一种优越的范例,特别是在模块化、维护和测试方面。DI也更复杂,并且在每个类中都需要更多的样板代码。通过参数化构造函数,可能添加一个数组,应该可以很容易地支持多个数据库连接w/singleton。DI是我在实践中发现的一个经常被过度使用的东西,在大多数情况下,单例更为实用。在使用设计模式时,应小心选择最适合应用程序需求的抽象级别。设计模式的一个实际挑战是为正确的工作选择正确的工具。是的,
db
类与当前的设计基本相同。您只是在更改它与应用程序中其他代码的关系。这种方法的一个“问题”是任何类都可以访问数据库资源。无法连接到第二个数据库。你不能让你的代码使用
db
的子类。依赖注入通常被认为是一种优越的范例,特别是在模块化、维护和测试方面。DI也更复杂,并且在每个类中都需要更多的样板代码。通过参数化构造函数,可能添加一个数组,应该可以很容易地支持多个数据库连接w/singleton。DI是我在实践中发现的一个经常被过度使用的东西,在大多数情况下,单例更为实用。在使用设计模式时,应小心选择最适合应用程序需求的抽象级别。设计模式的一个实际挑战是为正确的工作选择正确的工具。@epic_语法,是的,您也可以在这里定义连接。此解决方案与我的解决方案相同,只是在应用程序中实例化时,将
db
类的实例传递到所有其他类中,而使用Singleton,每个类都可以获得类本身的实例,这将发生在所有同一实例上。如果您不熟悉设计模式,这可能是一个更容易理解的解决方案,但我仍然鼓励您探索Singleton;数据库连接是它的常用用例。@epic_语法,是的,您也可以在此处定义连接。此解决方案与我的解决方案相同,只是在应用程序中实例化时,将
db
类的实例传递到所有其他类中,而使用Singleton,每个类都可以获得类本身的实例,这将发生在所有同一实例上。如果您不熟悉设计模式,这可能是一个更容易理解的解决方案,但我仍然鼓励您探索Singleton;数据库连接是it的常见用例。