为什么在Laravel 5中注入接口而不是具体类?*?

时间:2016-09-24 15:49:08

标签: php laravel-5 dependency-injection interface

我正在使用laravel 5. *(而且我也使用Laravel 4)我无法理解为什么注入接口而不是具体类更好。

有什么好处?

我正在注入接口,因为我读到它太好了,但是,我无法理解为什么。

谢谢!

1 个答案:

答案 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 - 课程不需要关心它的实现......

这只是一个简单的例子,但它解释了使用接口作为类型提示的一个,而且非常好的一个好处......