依赖注入中的默认值

时间:2014-06-24 08:24:29

标签: php oop dependency-injection

我目前有一个具有紧密耦合依赖关系的类,并且类构造函数当前没有任何参数。我试图能够选择性地传递不同的依赖项而不更改构造函数签名,从而破坏当前使用该类的应用程序。

我想出了这种模式:

class Car {
    private $engine;

    public function __construct($options = array()) {
        if (isset($options['engine']) {
            $this->engine = $options['engine'];
        } else {
            $this->engine = new Engine();
        }
    }
}

这样可以使用new car()创建Car(使用默认引擎),或者传入自定义引擎:new Car(array('engine' => new CustomEngine()))

这是一种正确的方法吗?这与可维护性有什么问题?

1 个答案:

答案 0 :(得分:6)

在我看来,这是一个正确的模式,我经常使用它。

依赖注入允许类的用户提供依赖项。使用您的代码,这是可能的,所以我没有看到它的问题。

我唯一不同的是,我使用显式参数,这样我就可以键入提示对象以确保它们是正确的类,并且更容易知道可以传递哪些参数而无需查看在代码:

class Car {
    private $engine;

    public function __construct(Engine $engine = null) {
        $this->engine = $engine ?: new Engine();
    }
}