我正在使用laravel 5. *(而且我也使用Laravel 4)我无法理解为什么注入接口而不是具体类更好。
有什么好处?
我正在注入接口,因为我读到它太好了,但是,我无法理解为什么。
谢谢!
答案 0 :(得分:3)
首先,这不是Laravel特有的,它只是一般被认为是最佳实践。
如果你注入一个具体的类,你刚刚创建了一个硬依赖。
如果你注入一个接口,你可以使用相同的代码,但只是为实现相同的接口注入不同的类(例如:prod的真实数据库类和测试的Mock DB类)。
实际上,你总是注入具体的类,它只是提示界面而不是具体类的类型
示例:
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
- 课程不需要关心它的实现......
这只是一个简单的例子,但它解释了使用接口作为类型提示的一个,而且非常好的一个好处......