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

Php 如何仅在需要时实例化依赖项,php,dependency-injection,Php,Dependency Injection,我的课程如下: class Foo { protected $dependency; function __constructor(Dependency $dependency) { $this->dependency = $dependency; } function get($name = null) { if(is_null($name)) return $this->

我的课程如下:

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);
问题是,即使不需要依赖项,我也会实例化它


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

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

  • 将后期实例化移动到
    Foo
    。为此,
    Foo
    需要某种工厂/服务定位器/依赖项注入容器,允许
    Foo
    在需要时获取
    dependency
    的实例。例如:

    public function get($name = null) {
        if (is_null($name)) {
            return $this->dependencyFactory->getInstance()->get();
        }
    }
    
    缺点:
    Foo
    需要意识到这种复杂性

  • 使
    依赖关系在内部变为惰性。无论
    Dependency
    使用资源做什么,都要延迟,直到第一次调用
    Dependency::get

    优点:其他组件不需要知道这种行为,可以像以前一样继续使用该类


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

  • 将后期实例化移动到
    Foo
    。为此,
    Foo
    需要某种工厂/服务定位器/依赖项注入容器,允许
    Foo
    在需要时获取
    dependency
    的实例。例如:

    public function get($name = null) {
        if (is_null($name)) {
            return $this->dependencyFactory->getInstance()->get();
        }
    }
    
    缺点:
    Foo
    需要意识到这种复杂性

  • 使
    依赖关系在内部变为惰性。无论
    Dependency
    使用资源做什么,都要延迟,直到第一次调用
    Dependency::get

    优点:其他组件不需要知道这种行为,可以像以前一样继续使用该类



  • 您应该使用setter注入,以便在需要时设置注入类,而不是使用构造函数注入。您应该使用setter注入,以便在需要时设置注入类。因此,如果
    $name
    null
    get()
    方法的内部?是。我只想在$name为null时注入依赖项,并且仍然应用控制反转
    在PHP中,并将其放入
    get
    方法中。或者使用setter注入。我将处于相同的情况,但使用setter或get函数时处于不同的函数中。因此,如果
    $name
    get()中为
    null
    ,则只希望注入依赖项
    method?是的。我只想在$name为null时注入依赖项,并且仍然应用控制反转。然后将其从构造函数中取出(spelt
    \uu construct()
    在PHP中,并将其放在
    get
    方法中。或者使用setter注入。我将处于相同的情况,但使用setter或get函数时处于不同的函数中。您能给我一些代码以便我更好地理解吗?请注意,这意味着
    Foo
    之外的一些外部代码需要知道
    Foo
    何时需要de依赖性。这扩展了以前包含在
    Foo::get
    中的逻辑。你能给我一些代码让我更好地理解吗?注意,这意味着
    Foo
    之外的一些外部代码需要知道
    Foo
    何时需要依赖性。这扩展了以前包含在
    Foo
    中的逻辑
    Foo::get
    。是的!使用容器的延迟加载是我问题的解决方案。谢谢!是的!使用容器的延迟加载是我问题的解决方案。谢谢!