2015-12-01 42 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(...) 
相關問題