2010-08-29 71 views
2

我有一個自己寫的自定義數據庫類,我也有一個用戶類和一個網站類。在我的項目中使用我的數據庫類與其他類

MySQL的類有這樣的方法:

connect 
query 
clean 
fetch 

用戶等級:

register 
login 
logout 
resetPass 

網站類:

updateTopics 
addTopic 
addPost 
addReply 

這些類需要接口一個數據庫,這就是我寫的MySQL類。但是,我不知道如何正確使用這些類的MySQL類。我是否將該類定義爲全局的,並將其引用到其他類中?我做類似的事情:

$db = new MySQL(); 
$user = new User($db); 

然後引用它嗎?

任何幫助表示讚賞,謝謝。 :)

+0

你在哪裏保持數據庫句柄?在MySQL類中,不是嗎? – erisco 2010-08-29 15:26:15

+0

當您建立與數據庫的第一個連接時,您需要保存引用它的句柄。爲什麼我詢問句柄的存儲位置是因爲如果你在MySQL類中這樣做,你將爲每個實例創建一個新的連接。如果你真的想要一個恆星系統,也許建立一個連接池(作爲一個單身人士),然後使用一些像建議的VolkerK這樣的IOC容器。 – erisco 2010-08-29 15:47:38

回答

0

則可以將其他類中實例化你的MySQL類,如下所示:

class User 
{ 
    private $db; 

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

    function accesses_database(...) 
    { 
    $this->db->query(...); 
    } 
} 

,然後引用$this->db類裏面,當你要訪問的數據庫。

此外,如果你想只有一個例子MySQL,你可以使它成爲singleton

+0

啊,這似乎是一個很好的解決方案。謝謝。 – Will 2010-08-29 15:31:02

+0

我投下了這個,因爲我認爲這實際上是一個糟糕的解決方案。例如見http://misko.hevery.com/code-reviewers-guide/flaw-constructor-does-real-work/ – koen 2010-08-29 17:20:23

0

您可能只想對一次MySql類進行實例化。它會阻止連接在執行過程中多次打開和關閉。我喜歡使用工廠概念。它是一個處理對象實例化的類,你可以編寫它來只允許一個實例,遵循Singleton概念。

成才這樣的:

class Factory { 

    private static $objects = array(); 

    static function get_database() { 

     if(! isset(self::$objects['database'])) 
      self::$objects['database'] = new MySql(); 

     return self::$objects['database']; 
    } 
} 

你會使用這樣的:

$db = Factory::get_database(); 

需要注意的是,它總是返回的MySQL同一個實例,而不是創建新的。

好吧,但它只是一個工廠的非常簡單的實現,只是爲了理解。它可能會好很多=]

+0

啊,是的,這樣做更有意義。所以Factory類基本上持有我一次使用的所有其他對象?這是否意味着如果我要使用這種方法,那麼每次使用任何類時都必須執行'Factory :: whatever();'等操作。 – Will 2010-08-29 22:11:38

+0

只是你想防止被多次實例化的那些。好吧,這不是唯一的解決方案。就像我說的,這只是我喜歡的那個。但它並沒有做到這一點。這個工廠可以幫助你集中你的課堂依賴並促進他們的配置。我不推薦的是每次使用數據庫時都會執行'新的MySql'。 – 2010-08-30 01:14:39

相關問題