一个对象应该自己“加载”另一个对象,还是让另一个对象传递给它?

时间:2011-09-26 07:44:04

标签: php oop separation-of-concerns

从原始对象中加载另一个对象是一个好习惯,如下所示:

Class parent() {

    $child;

    function loadChild() {
        $child = new Child();
        $this->child = $child;
    }
}

或者,是否应始终单独传递子对象?

Class parent() {

    $child;

    function setChild(child $child) {
        $this->child = $child;
    }
}

$parent = new Parent();
$child = new Child();
$parent->setChild($child);

哪个更好,更灵活等?

3 个答案:

答案 0 :(得分:4)

第二种选择更合适。它被称为Dependency Injection。其中一个主要原因是您可以传递任何实现child接口的对象(包括模拟对象,这对TDD很重要),而无需修改您的类。

答案 1 :(得分:4)

这取决于具体情况。

第二个对象的名称表明

  1. Child实例仅由Parent实例
  2. 使用
  3. 不需要比Parent实例
  4. 更长寿

    如果是这种情况,那么第一种模式(Object composition pattern)就更好了。

    如果代码中的其他位置需要/使用Child实例,则第二种模式(Dependency injection)更合适。依赖注入是一种更灵活的模式,如果您不确定您的用例,通常应该使用依赖注入。

答案 2 :(得分:1)

依靠你想要的东西。如果您确定不需要更换子项,则可以在对象中创建它。少代码=>减少错误。但是如果你以后想要有不同的Childs,那就太糟糕了。