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


How can I set up a mysqli object without actually connecting yet?

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

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

$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数据库的实际连接是否已建立,如果尚未建立,则如何建立它?

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

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:

$db = new lazyMysqli( MYSQLHOST, MYSQLUSER, MYSQLPASS );

这将初始化所有内容,并且对象可以传递给其他类,例如。在每次对数据库执行实时操作之前,我都会调用lazyMysqli::init()来实际建立与服务器的连接。这样,我就不必浪费资源,也不必在需要之前真正建立到服务器的连接,而且我仍然可以与其他类共享mysqli对象。

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

$db->init()->query(...)