2011-11-04 81 views
2

是否可以在對象中使用對象?例如,我有一個MySQL類,它具有與MySQL相關的所有方法(連接,查詢,獲取行...),並創建一個名爲User的新對象,該對象將具有諸如登錄,註銷,註冊等方法。 ..是否有可能包括我的MySQL類,定義一個對象,然後在我的新對象中運行查詢?如果是這樣,如何? 例如:在對象中使用對象?

class User{ 
    $m = new MySQL(); 
    function login($username, $password, $remember = false){ 
       $m->rQuery("SELECT * FROM users......"); 
    } 
} 
+1

臨提示:*將您的數據庫對象傳遞給用戶,而不是讓用戶自己實例化它。它減少*耦合。*檢查[依賴注入](http://en.wikipedia.org/wiki/Dependency_injection) – webbiedave

回答

2

是的,你可以使用它像這樣的任何子對象:

class User{ 
    private $db; 

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

    function login($username, $password, $remember = false){ 
       $this->db->rQuery("SELECT * FROM users......"); 
    } 
} 
3

是否有可能在對象上使用一個對象?

是的。

使用__construct函數初始化,你需要

0

Ofcource,你可以,但不是這樣的。你可以做的就是這樣:

class User 
{ 
    private $m = null; 

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

    function login($username, $password, $rememer = false) 
    { 
     $this->m->rQuery("SELECT * FROM users......"); 
    } 
} 
+0

舊式構造函數。我贊成'__construct'。 – GolezTrol

+0

您降級的時間我更改了構造函數名稱。如果您喜歡,請再次提高 –

+0

感謝您的提升。 –

2

的答案是非常相似的人,但有一個 - 在我看來,關鍵的 - 區別:不是實例的依賴/依賴於構造通過他們構造:

class User 
{ 
    protected $db; 

    public function __construct(Db $db) 
    { 
     $this->db = $db; 
    } 

    public function login($username, $password) 
    { 
     $this->db->query("SELECT * FROM users..."); 
    } 
} 

這種類型的dependency injection的好處包括:

  1. 它清楚地表明客戶/消費者類(User)具有依賴關係(Db)。
  2. 減少User類和Db類之間的耦合。這對unit-testingUser類有顯着幫助。您可以創建一個按預期執行的模擬Db。任何測試失敗都明確歸因於User類。

當然,爲了實例化User對象,您需要首先實例化一個Db對象。由於單個對象或長鏈依賴關係存在很多依賴關係,這可能是一種痛苦。在這種情況下,使用工廠或依賴注入容器來協助創建對象是有幫助的,但不是必需的。