首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有实际连接的情况下设置mysqli对象?

问如何在没有实际连接的情况下设置mysqli对象?
EN

Stack Overflow用户
提问于 2015-12-01 17:02:49
回答 1查看 163关注 0票数 1

对于所有共享相同数据库的不同对象,我有几个类。我希望这些对象共享相同的MySQLi连接,所以我不需要为每个对象都有一个连接,但是并不是所有的命令都需要一个活动的MySQLi连接,所以我想在需要的时候设置它。在我的例子中,每次调用API时连接到MySQL服务器都是对资源的巨大浪费。

所以我的主要API会有这样的东西(理想地):

代码语言:javascript
复制
$db = new mysqli();
$a = new objA( $db );

class objA{
    private $db;

    function __construct( $db ){
        $this->db = $db;
    }

    function doSomething(){
        if( !$this->db->isConnected() )
            $this->db->connect( MYSQL_HOST, MYSQL_USER, MYSQL_PASS );

        return $this->db->query( MY_QUERY );
    }
}

因此,只有当我从API调用$a->doSomething()时,才会构建数据库连接。此设置还将使我能够在完全不同的对象中使用相同的MySQL连接。

我怎样才能得到像$mysql->isConnected()这样的函数来检查到MySQL数据库的实际连接是否已经建立,如果还没有构建它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-01 23:05:07

最后,我从mysqli派生了一个名为lazyMysqli的类:

代码语言:javascript
复制
class lazyMysqli extends mysqli{
    private $init;

    private $mysql_host;
    private $mysql_username;
    private $mysql_passwd;
    private $mysql_dbname;
    private $mysql_port;
    private $mysql_socket;

    function __construct( $host = null, $username = null, $passwd = null, 
        $dbname = null, $port = null, $socket = null ){
        $this->mysql_host = $host;
        $this->mysql_username = $username;
        $this->mysql_passwd = $passwd;
        $this->mysql_dbname = $dbname;
        $this->mysql_port = $port;
        $this->mysql_socket = $socket;

        $this->init = false;
    }

    function init(){
        if( !$this->init ){
            parent::__construct( $this->mysql_host, $this->mysql_username, 
                $this->mysql_passwd, $this->mysql_dbname, 
                $this->mysql_port, $this->mysql_socket );
            $this->init = true;
        }

        return $this;
    }
}

现在,不再定义一个新的mysqli,而是使用一个lazyMysqli

代码语言:javascript
复制
$db = new lazyMysqli( MYSQLHOST, MYSQLUSER, MYSQLPASS );

这将初始化所有内容,例如,对象可以传递给其他类。在对数据库进行每次活动之前,我调用lazyMysqli::init()来实际设置到服务器的连接。这样,我就不必浪费资源,也不必在需要之前实际构建到服务器的连接,而且我仍然能够与其他类共享mysqli对象。

init()函数返回对象本身,因此它可以冒泡:

代码语言:javascript
复制
$db->init()->query(...)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34025878

复制
相关文章

相似问题

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