service container最明显的一个特点是,它产生实例不需要显性的new一个类,因此甚至也不需要传入构造函数的参数(如果参数也是可以通过容器生成),看一个类的定义:
class FooHandler
{
public __construct(Bar $bar = null)
{
// ...
$bar->doSomething();
}
}
如果你直接通过new FooHandler($bar)
,生成你需要的对象时,必须先得到Bar
的实例$bar
,这在有时候是没必要的,在Laravel中,可以直接通过:
$fooHandler = app()->make(FooHandler::class);
得到,唯一不足的一点是$fooHandler
不能被IDE智能识别。