Php,复合模式,当孩子们知道父母的时候是不是很糟糕?

Php,复合模式,当孩子们知道父母的时候是不是很糟糕?,php,Php,鉴于此代码: class Parent { public function getAdata() { return array(1,2,3,4); } public function getChild() { return new Child ($this); } } class Child { public function __constructor (Parent $p) {

鉴于此代码:

class Parent
{
    public function getAdata()
    {
        return array(1,2,3,4);
    }

    public function getChild()
    {
        return new Child ($this);
    }
}

class Child
{
    public function __constructor (Parent $p)
    {
        $p->getAdata();
    }
}
他们说这很糟糕,因为孩子知道父母的事。如果我这样重写:

class Parent
{
    public function getAdata()
    {
        return array(1,2,3,4);
    }

    public function getChild()
    {
        return new Child ($this->getAdata());
    }
}

class Child
{
    public function __constructor ($data)
    {
    }
}

更好,但为什么呢?

这里根本没有亲子关系。您只需实例化一个类并将另一个类的实例传递给它。这一点都没有问题,这并不意味着这些类之间存在任何关系


该示例的缺点是您在父级中硬编码子级。这使得Child成为一个硬编码的依赖项,不能被替换或外部控制,因此将来可能会在测试或重构代码时出现问题。你应该研究依赖注入。

他们是谁?所提供的示例过于笼统,无法说明哪一个更好。这一切归结为孩子需要知道什么。如果子实例只从父实例调用getData,那么最好只传递必要的信息。您应该使用类Child extends Parents复合模式中的参与者是component、composite和leaf,而不是parent和ChildBw,这看起来像是输入错误,但是。。。在类层次结构中,子级总是需要知道它的父级;父母不应该知道他们的孩子。