2016-09-24 41 views

回答

1

首先,這不是Laravel特有的,它只是一般的最佳實踐。

如果你注入一個具體類,你剛剛創建了一個硬依賴。

如果你注入一個接口,你可以使用相同的代碼,但只是注入不同的類(例如:用於生產的真正的數據庫類和用於測試的模擬數據庫類)來實現相同的接口。

其實,你總是注入具體的類,它只是類型提示這是一個具體類的接口而不是

例子:

class DB implements DBInterface 
{ 
    // A bunch of methods fetching from real DB 
} 

class MockDB implements DBInterface 
{ 
    // Has the same (interface) methods but returns some fixed data for testing. 
} 

class Posts 
{ 
    public function __construct(DBInterface $db) 
    { 
     $this->db = $db; 
    } 

    public function get() 
    { 
     $this->db->query("...."); 
    } 
} 

$posts = new Posts(new DB); 
$data = $posts->get(); // This fetches from the real db 

// And for testing 
$posts = new Posts(new MockDB); 
$data = posts->get(); // Fetches from the mock DB instead 

這樣做的動力是類你」重新注入將具有相同的類簽名,但可以有完全不同的實現。 您的Posts -class不需要關心它得到什麼實現...

這只是一個簡單的例子,但它解釋了一個,真的很好,使用接口作爲類型提示的好處...

+0

完美的馬格努斯。這是一個非常好的答案。當然,我知道我正在注入一個具體的類和類型暗示接口,但...我不知道爲什麼鍵入提示接口,而不是直接具體的類。 謝謝! –

相關問題