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

时间:2014-03-01 14:12:35

标签: php design-patterns dependency-injection inversion-of-control

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

  1. 将配置传递给构造函数
  2. 不要将config传递给构造函数,而是在构造函数中加载xml
  3. 传递可以加载所需配置的中间对象
  4. 将配置传递给执行操作的公共方法
  5. 我目前正在使用选项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()
        {
    
        }
    
    }
    

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

1 个答案:

答案 0 :(得分:0)

我的建议

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

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

此外,与这种情况相比,这类课程的测试更容易编写和验证。当然,在这里你也可以通过模拟configLoader来编写测试,但为什么通过模拟我们是否可以通过正常注入来实现: - )

对您的方法的建议

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

我建议取消const变量并将函数调用更改为:

$ configLoader-> loadMyClassConfig();