对象间的PHP MySQL连接共享

对象间的PHP MySQL连接共享,php,mysql,static,database-connection,Php,Mysql,Static,Database Connection,我试图找出最好的方法是让程序中的多个对象连接到数据库 我创建了一个带有静态连接变量的类。这似乎意味着只打开一个连接,所有对象共享它 class Database { public static $mysql; function __construct() { if (!isset(self::$mysql)) { echo "Make static connection\n"; self::$mysql = new

我试图找出最好的方法是让程序中的多个对象连接到数据库

我创建了一个带有静态连接变量的类。这似乎意味着只打开一个连接,所有对象共享它

class Database {
    public static $mysql;
    function __construct() {
        if (!isset(self::$mysql)) {
            echo "Make static connection\n";
            self::$mysql = new mysqli("localhost", "gamalert", "c45ualty", "events");
            if (self::$mysql->connect_errno) {
                echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . self::$mysql->connect_error;
            }
            echo self::$mysql->host_info . "\n";
        }
    }
}
一个普通的对象版本。这将为使用它的每个对象创建一个新连接

class Database {
    public $mysql;
    function __construct() {
        if (!isset($this->mysql)) {
            echo "Make connection\n";
            $this->mysql = new mysqli("localhost", "gamalert", "c45ualty", "events");
            if ($this->mysql->connect_errno) {
                echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . $this->mysql->connect_error;
            }
            echo $this->mysql->host_info . "\n";
        }
    }

我想知道你的首选是什么?我计划稍后测试性能差异。

连接到数据库是一项非常昂贵的操作,您应该避免创建多个连接。所以你应该放弃你的普通对象版本

带有静态变量的选项更好,但并不理想。您需要记住在每个类中复制此构造函数。如果你想在这方面做些改变呢?然后你需要打开所有的类,并在任何地方更改它

我认为,应该创建抽象对象
数据库
,并用类扩展它

abstract class Database {
    protected static $mysql;
    function __construct() {
        if (!isset(self::$mysql)) {
            echo "Make static connection\n";
            self::$mysql = new mysqli("localhost", "gamalert", "c45ualty", "events");
            if (self::$mysql->connect_errno) {
                echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . self::$mysql->connect_error;
            }
            echo self::$mysql->host_info . "\n";
        }
    }
}
然后创建将使用此连接的新对象很简单:

class ExtDatabase extends Database {
    public function __construct() {
        echo "Executing parent...";
        parent::__construct();
    }

    public function hostInfo() {
        //no problem with using connection there
        echo self::$mysql->host_info . "\n";
    }
}

但是。。。这也不是很好的选择。最好使用带有连接的Singleton和抽象数据库类。

连接到数据库是非常昂贵的操作,您应该避免创建多个连接。所以你应该放弃你的普通对象版本

带有静态变量的选项更好,但并不理想。您需要记住在每个类中复制此构造函数。如果你想在这方面做些改变呢?然后你需要打开所有的类,并在任何地方更改它

我认为,应该创建抽象对象
数据库
,并用类扩展它

abstract class Database {
    protected static $mysql;
    function __construct() {
        if (!isset(self::$mysql)) {
            echo "Make static connection\n";
            self::$mysql = new mysqli("localhost", "gamalert", "c45ualty", "events");
            if (self::$mysql->connect_errno) {
                echo "Failed to connect to MySQL: (" . $this->mysql->connect_errno . ") " . self::$mysql->connect_error;
            }
            echo self::$mysql->host_info . "\n";
        }
    }
}
然后创建将使用此连接的新对象很简单:

class ExtDatabase extends Database {
    public function __construct() {
        echo "Executing parent...";
        parent::__construct();
    }

    public function hostInfo() {
        //no problem with using connection there
        echo self::$mysql->host_info . "\n";
    }
}

但是。。。这也不是很好的选择。最好使用带有连接和抽象数据库类的Singleton。

我的首选版本是创建实例(第二个),而不是使用静态方法污染全局命名空间。您是否也考虑过使用?@DanLee您认为他在哪里污染全局命名空间?他只是(在某种程度上)在这里应用了单例模式,这没什么错。我更喜欢第一种方法,因为我认为MySQL连接重用更好,因为第二种方法在每个请求有多个查询/连接的情况下会产生更多的开销。是的,全局名称空间是错误的。我的意思是我更喜欢依赖注入而不是单身。而且开销并不是使用反模式的借口。我对模式的概念相当陌生,只是在研究这一点时才发现它们。然而,尽管我读过很多关于单例的建议,但它们也被认为是不好的。我的首选版本是创建一个实例(第二个),而不是用静态方法污染全局名称空间。你也考虑过使用吗?@DanLee你认为他在哪里污染全局名称空间?他只是(在某种程度上)在这里应用了单例模式,这没什么错。我更喜欢第一种方法,因为我认为MySQL连接重用更好,因为第二种方法在每个请求有多个查询/连接的情况下会产生更多的开销。是的,全局名称空间是错误的。我的意思是我更喜欢依赖注入而不是单身。而且开销并不是使用反模式的借口。我对模式的概念相当陌生,只是在研究这一点时才发现它们。然而,尽管我读过很多关于单身汉的建议,他们也被认为是不好的。