【发布时间】:2015-12-26 13:00:57
【问题描述】:
我正在尝试理解 PHP 中的依赖注入,我发现在 Laravel 中有两种方法可以做到这一点。
所以让我们说我有这样的课程Foo:
class Foo{
}
现在我有一个名为 Bar 的类,它依赖于 Foo,所以我可以这样做:
class Bar{
protected $foo;
public function __construct()
{
$this->foo = new Foo();
}
}
但在 Laravel 中,我遇到了诸如类型提示和反射之类的术语,它们允许我这样做:
class Bar{
protected $foo;
public function __construct(Foo $foo)
{
$this->foo = $foo;
}
}
我想了解的是这两者之间的区别。它们完全一样吗?有什么特别的原因我应该更喜欢另一个吗?
PS:我是新手,我不确定我是否正确使用了问题中的行话。
【问题讨论】:
-
第一个例子很难测试,因为你不能在 Bar 中模拟 Foo;第二个称为依赖注入 (DI),它允许您在测试 Bar 时模拟 Foo
-
第二个也消除了 Foo 实际上是 Foo 实例的必要性,但允许它是 Foo 或任何扩展 Foo 的类的实例(类型提示强制执行)... . 松耦合,因为你不再受限于实际的 Foo
-
@MarkBaker:所以你的意思是说,如果我编写一个接口并且它有多个实现,控制器不需要知道我要使用哪个实现,我可以输入提示界面。我理解对了吗?
-
您理解正确:您不需要 DI 的类型提示;但是提示松散耦合的接口是 typehint 的价值.... DI 本身对于使类更易于测试很有价值,但不需要 typehint;但这也是通过类型提示进行松散耦合的必要步骤
标签: php laravel dependency-injection type-hinting