从构造函数加载配置或将其作为依赖项传递



如果类需要一些 xml 配置值才能执行操作,则以下哪种配置最好:

  1. 将配置传递给构造函数
  2. 不要将配置传递给构造函数,而是在构造函数中加载 xml
  3. 传递一个可以加载所需配置的中间对象
  4. 将配置传递给执行操作的公共方法

我目前正在选择选项 3:

class MyClass
{
    private $config;
    const CONFIG_XML_PATH = '/xml/path/to/my/config/node'
    public function __construct($configLoader)
    {
        $this->config = $configLoader->load(self::CONFIG_XML_PATH)
    }
    public function doAmazingThingUsingConfig()
    {
    }
}

这是正确的方法还是有更好的方法?

我的建议

恕我直言,需要构造的类不应该负责创建和加载它自己的依赖项。

依赖项应在类外部创建,然后使用任何类型的依赖项注入传递给类。

此外,此类的测试将比在这种情况下更容易编写和验证。当然,在这里你也可以通过模拟 configLoader 来编写测试,但如果我们可以通过正常注入来做,为什么要通过模拟来做:-)

对您的方法的建议

如果你真的想采用你的方法,那么至少抽象出配置加载类不直接使用文件(这样你也可以用其他方式加载配置)

我建议取消 const 变量并将函数调用更改为如下所示的内容:

$configLoader->loadMyClassConfig();

最新更新