2015-12-01 113 views
1

我有几个不同对象的类都共享相同的数据库。我希望这些对象共享相同的MySQLi连接,因此我不必为每个对象都建立连接,但并非所有命令都需要活动的MySQLi连接,所以我想在需要时设置它。每次调用API时连接到MySQL服务器对我而言都是巨大的资源浪费。如何在没有实际连接的情况下建立一个mysqli对象?

所以我的主要API将有这样的事情(idealy):

$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); 
    } 
} 

因此,数据库连接只会是建立,如果我会打电话$a->doSomething()从API。这个设置也使我能够在完全不同的对象中使用相同的MySQL连接。

如何获取像$mysql->isConnected()这样的函数来检查与MySQL数据库的实际连接是否已构建,如果尚未建立,建立它?

+1

您是否尝试过使用辛格尔顿为你的数据库连接? –

+0

这不是问题......我不想强制只有一个连接,我试图阻止与MySQL服务器通信,直到我真的需要。 – patrick

+0

您是否必须定义'$ db = new mysqli();'?是否有可能为你分配'null'并验证if($ this-> db === null)'那么就没有连接,并且你的'$ this-> db = new mysqli(); '在if语句中连接之前。 –

回答

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(...) 
相关问题