2017-08-27 21 views
1

我有DI ImapClient $imapClient自定義類:如何在類中使用依賴注入?

class MailBoxCleaner 
{ 
    public function __construct(ImapClient $imapClient) 
    { 
    } 
} 

而且有一個門面類:

class ImapConnection { 

    public function __construct() 
    { 
    return new ImapClient(); 
    } 
} 

我試圖用此類似:

$MailBoxCleaner = new MailBoxCleaner(new ImapConnection()); 

但它不工作。

+0

你可以更清楚地告訴我們什麼是不工作的,什麼是你的期望。 –

回答

1

構造函數從不返回任何數據。

您必須創建一個getter方法來返回ImapClient類的實例,以便將其注入到其他類中。

基於您的代碼:

class ImapConnection { 
    private $imapClient = null; 

    public function __construct() 
    { 
    $this->imapClient = new ImapClient(); 
    } 

    public function getImapClient(){ 
    return $this->imapClient; 
    } 
} 

你可以注入:

$idObj = new ImapConnection(); // Instanciation 

$MailBoxCleaner = new MailBoxCleaner($idObj->get()); 

你也可以使用一個 「模式」:

class ImapConnection { 
    private $instance = null; 
    private $imapClient = null; 

    private function __construct() 
    { 
    $this->imapClient = new ImapClient(); 
    } 

    public static function getImapClient(){ 
    if(is_null($this->instance){ 
     $this->instance = new ImapConnection(); 
    } 
    return $this->instance->get(); 
    } 


    private function get(){ 
    return $this->imapClient; 
    } 
} 

然後,您可以使用您的代碼:

$MailBoxCleaner = new MailBoxCleaner(ImapConnection::getImapClient()); 
+1

你能通過一個例子來擴展你的答案嗎? – OPV

+0

爲什麼你有兩個'getImapClient()'? – OPV

+0

只是粘貼代碼的錯誤...第二個應該是「get()」,並在「getImapClient()」返回$ this-> instance-> get()。 我修改了答案 –