2014-02-21 31 views
0

我試圖訪問類之外的對象。我已經有一個名爲Database的類,它有一系列的功能。如何訪問類外的對象

$database = new Database($host,$user,$pass,$name); 

class User { 

    function view($username) { 
     $user = $database->findFirst('User','username',$username); 
    } 
} 

我不能解決如何訪問$數據庫對象,並不斷收到錯誤說未定義的變量。

回答

1

您可以使用依賴注入 - 構造注入,例如,

class User 
{ 

    /** 
    * @var Database 
    */ 
    protected $db; 

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

    public function view($username) 
    { 
     $user = $this->db->findFirst('User', 'username', $username); 
    } 
} 


$database = new Database(/* ... */); 
$user = new User($database); 

關於評論的問題:是的,這是可能的。讓我們考慮一些基本(抽象)類,它可以用作所有應共享相同基本邏輯(例如連接到數據庫或至少注入數據庫連接)的類的父級。

這種抽象類可以是:

class DBObject 
{ 

    /** 
    * @var Database 
    */ 
    protected $db; 

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

然後我們User類可以以這種方式擴展這個抽象類:

class User extends DBObject 
{ 

    public function view($username) 
    { 
     $user = $this->db->findFirst('User', 'username', $username); 
    } 
} 

請記住,雖然抽象類可以實現__construct()功能,它不能被直接實例化。然後在代碼中的某處你可以做與第一個例子非常相似:

$database = new Database(/* ... */); 
$user = new User($database); 
$post = new Post($database); 
+0

有沒有辦法依賴注入來說,一個Main類,然後從那裏擴展User類? – ablshd

+0

我不知道我明白你的意思...你能更具體嗎? – shadyyx

+0

因此,例如說我有一個用戶類,一個職位類,一個頁面類等需要訪問數據庫類。有沒有什麼辦法可以創建一個「傘」類,以便我可以擴展其他類,以便他們可以訪問數據庫,而不是單獨構建每個數據庫對象? – ablshd

1

$database應該是班級成員。試試這個:

$database = new Database($host,$user,$pass,$name); 

class User { 
    protected $db; 
    public function __construct($database) { 

     $this->db = $database; 
    } 
    public function view($username) { 

     $user = $db->findFirst('User','username',$username); 
    } 
} 
+0

@Cthulhu你是對的。對不起,我忽略了這一點。感謝您指出。 –

0

只需在函數中將其定義爲全局變量即可。然而,正確的方法是製作構造函數或擴展它與數據庫類。

$database = new Database($host,$user,$pass,$name); 

    class User { 

     function view($username) { 
      global $database; 
      $user = $database->findFirst('User','username',$username); 
     } 
    } 

P.S. Here是另一篇文章,您可以看到與此解決方案相同的情況。

+0

PHP4引入了關鍵字'global',因爲它也只能保留在PHP4中。在PHP5中有更好的面向對象實現,允許更好的面向對象方法... – shadyyx

+0

你是什麼意思*擴展它與數據庫類*?你能舉一些例子嗎? – shadyyx

+0

是的。我提到正確的方法是使用構造函數或擴展類與數據庫類(或mysqli)。我的意思是**類用戶擴展數據庫{} **對不起,英語不是我的母語。 –