首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP MySQL对象间的连接共享

问PHP MySQL对象间的连接共享
EN

Stack Overflow用户
提问于 2012-06-29 16:48:28
回答 1查看 1K关注 0票数 2

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

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

代码语言:javascript
复制
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";
        }
    }
}

一个普通的对象版本。这将为使用它的每个对象创建一个新连接。

代码语言:javascript
复制
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";
        }
    }

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

EN

回答 1

Stack Overflow用户

发布于 2012-06-29 17:01:38

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

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

我认为,您应该创建抽象对象Database,并使用您的类扩展它。

代码语言:javascript
复制
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";
        }
    }
}

然后创建将使用此连接的新对象很简单:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11258705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档