如何在需要时仅实例化依赖项

时间:2017-08-23 14:16:30

标签: php dependency-injection

我的课程如下:

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);

问题在于,即使不需要依赖,我也会实例化。

如何仅在需要时实例化依赖项?

2 个答案:

答案 0 :(得分:2)

在您实例化Foo时,您实际上并不知道Foo是否需要依赖项,因此在您注入依赖项时。如果你想要一个懒惰的依赖,你可以将这种复杂性转移到两个地方之一:

  1. 将后期实例化移至Foo。因为Foo需要某种工厂/服务定位器/依赖注入容器,允许Foo在需要时获取Dependency的实例。 E.g:

    public function get($name = null) {
        if (is_null($name)) {
            return $this->dependencyFactory->getInstance()->get();
        }
    }
    

    缺点:Foo需要注意这种复杂性。

  2. 在内部让Dependency懒惰。无论使用资源Dependency做什么,都要延迟第一次调用Dependency::get

    优点:其他组件无需了解此行为,可以像以前一样继续使用该类。

答案 1 :(得分:0)

而不是使用构造函数注入,您应该使用setter注入,以便在需要时设置注入类