具有“默认依赖项”的PHP Setter依赖项

时间:2016-02-02 00:24:08

标签: php dependency-injection containers

我目前正在研究一个依赖注入容器,我遇到了很多不同类型的容器(Pimple,Orno / di,Laravel的......),我打算做一些接近Pimple的事情。但我还有一个问题,如果我使用setter和getter进行DI,那么在依赖类的构造函数中注入“default dependencies”是否正确?让我举个例子:

所以这是我的例子:

<?php

class Dependency
{
    public function print($str)
    {
        echo $str;
    }
}


class Dependent
{
    private $_dependency;

    public function __construct()
    {
        $this->_dependency = new Dependency;
    }


    public function setDependency(Dependency $dep)
    {
        $this->_dependency = $dep;
        return $this;
    }

    public function depPrint($str)
    {
        $this->_dependency->print($str);
        return $this;
    }
}

这样,用户代码可以在不知道其依赖性的情况下直接使用该类:

$instance = new Dependent;
$instance->depPrint('Hello world');

或者如果用户代码需要该类使用另一个依赖项,它可以这样做:

$instance = new Dependent;
$instance->setDependency(new Dependency)
    ->depPrint('Hello world');

我觉得它很方便,因为在测试中你可以用mock类替换依赖项,并且用户代码不必知道有关类依赖项的任何信息。我发现最大的缺点是它仍然会创建与默认依赖项的耦合,但是这可以通过检查类是否存在而轻松修复,如果它不存在,则默认情况下不要注入任何内容。那么,这个系统是否有任何缺点,我应该使用它还是应该使用其他东西?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

你可以把这两件事结合起来:

public function __construct($dep = null)
{
    if (is_null($dep)) {
      $this->_dependency = new Dependency;
    } else {
      $this->_dependency = $dep;
    }
}