Php 对子类使用setter注入额外的依赖项

Php 对子类使用setter注入额外的依赖项,php,oop,Php,Oop,例如,假设您有: abstract class AbstractA { private $dependency1; private $dependency2; private $dependency3; public function __construct(One $dep1, Two $dep2, Three $dep3) { // Set the class properties... } } 现在我们有一个类B: class

例如,假设您有:

abstract class AbstractA {

    private $dependency1;
    private $dependency2;
    private $dependency3;

    public function __construct(One $dep1, Two $dep2, Three $dep3) {
        // Set the class properties...
    }

}
现在我们有一个类
B

class B extends AbstractA {

    private $dependency4;
    private $dependency5;

    public function __construct(One $dep1, Two $dep2, Three $dep3, Four $dep4, Five $dep5) {
        parent::__construct($dep1, $dep2, $dep3);
        $this->dependency4 = $dep4;
        $this->dependency5 = $dep5;
    }

}
如果我们有类
C
D
E
F
一直到
Z
,它们是
AbstractA
的子类/子类,并且比
AbstractA
有一个或多个额外的依赖项,该怎么办。如果出于某种原因想要更改
AbstractA
类中依赖项的顺序或删除其中一个,那么现在必须编辑类
B
中的构造函数,直到
Z
,这需要很长时间

我在想,如果您使用setter注入来注入子类可能需要的任何额外依赖项,那么您不需要不断地将构造函数添加到子类中,因此更改抽象类依赖项不需要3个小时

class B extends AbstractA {

    private $dependency4;
    private $dependency5;

    // No constructor so the parent one gets executed.

   public function setDependency4(......

   public function setDependency5(......

}
我知道,为了使用这个类,您必须记住在实例化对象之后注入额外的依赖项,这是额外的工作,但从长远来看可能会节省时间


这是个好主意还是个坏主意?

您应该更喜欢组合而不是继承=p通常,如果您的类具有如此多的依赖项,那么它被认为是一种代码味道。您还应该考虑这样一个事实,您的“依赖项”对于实例的功能可能不是强制性的。相反,这些“依赖项”实际上只是由一些方法执行。因此,您可以根据需要在方法中传递它们,而不是使用类的局部变量。好的,谢谢。我确实使用了很多接口,但有时我会进行继承。您应该使用库来管理依赖项,就像使用setter一样,而不是试图通过setter来管理依赖项。@Danack我确实使用了一个接口,但我认为您误解了我的问题。不过现在没事了。值得一读: