我的课程如下:
class Foo {
protected $dependency;
function __constructor(Dependency $dependency)
{
$this->dependency = $dependency;
}
function get($name = null)
{
if(is_null($name))
return $this->dependency->get();
return $name;
}
}
new Foo(new Dependency);
问题在于,即使不需要依赖,我也会实例化。
如何仅在需要时实例化依赖项?
答案 0 :(得分:2)
在您实例化Foo
时,您实际上并不知道Foo
是否需要依赖项,因此在您注入依赖项时。如果你想要一个懒惰的依赖,你可以将这种复杂性转移到两个地方之一:
将后期实例化移至Foo
。因为Foo
需要某种工厂/服务定位器/依赖注入容器,允许Foo
在需要时获取Dependency
的实例。 E.g:
public function get($name = null) {
if (is_null($name)) {
return $this->dependencyFactory->getInstance()->get();
}
}
缺点:Foo
需要注意这种复杂性。
在内部让Dependency
懒惰。无论使用资源Dependency
做什么,都要延迟第一次调用Dependency::get
。
优点:其他组件无需了解此行为,可以像以前一样继续使用该类。
答案 1 :(得分:0)
而不是使用构造函数注入,您应该使用setter注入,以便在需要时设置注入类