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

时间:2015-12-01 17:02:50

标签: php mysqli

我有几个不同对象的类,它们共享同一个数据库。我希望这些对象共享相同的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数据库的实际连接,如果没有则构建它?

1 个答案:

答案 0 :(得分:0)

我最终从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(...)