0
我正在使用laravel 5. *(並且我也使用Laravel 4),我無法理解爲什麼注入接口而不是具體類更好。爲什麼在Laravel 5中注入接口而不是具體類。*?
有什麼好處?
我正在注入接口,因爲我讀過它太好了,但是,我不明白爲什麼。
謝謝!
我正在使用laravel 5. *(並且我也使用Laravel 4),我無法理解爲什麼注入接口而不是具體類更好。爲什麼在Laravel 5中注入接口而不是具體類。*?
有什麼好處?
我正在注入接口,因爲我讀過它太好了,但是,我不明白爲什麼。
謝謝!
首先,這不是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不需要關心它得到什麼實現...
這只是一個簡單的例子,但它解釋了一個,真的很好,使用接口作爲類型提示的好處...
完美的馬格努斯。這是一個非常好的答案。當然,我知道我正在注入一個具體的類和類型暗示接口,但...我不知道爲什麼鍵入提示接口,而不是直接具體的類。 謝謝! –