从子类

时间:2017-05-17 15:05:32

标签: php oop inheritance dependency-injection

我有一个父类A和一个子类B。我现在的目标是初始化contentA的属性)。只有B知道应该进入A::content内的值。

class A
{
    protected $m;
    protected $n;
    protected $p;
    protected $content;

    public function __construct() {
        $this->init();
        $b = new B;
        $this->content = $b->getContent();
    }

    private function init() {
        $this->m = 'Nobody';
        $this->n = 'is';
        $this->p = 'like';
    }

    public function getContent() {
        return $this->content;
    }
}

class B extends A
{
    protected $x;

    public function __construct() {
        $this->init();
        $this->content = $this->m.' '.$this->n.' '.$this->p.' '.$this->x.' (according to '.$this->x.')';
    }

    private function init() {
        $this->x = 'Donald Trump';
    }
}

$a = new A;
echo $a->getContent();

在我的项目中,我有一些类 - 比方说B,C,D(它们在上面的代码中看起来像B)。它们都有一个共同点:它们需要A的变量和方法来设置A::content的值。

我现在的问题是:这是实现目标的“好方法”吗?另一种选择可能是不使用继承,而是将A的实例注入B的构造函数......或者其他替代方案?

编辑: 好吧......看起来我无法让自己清楚。不幸的是,我的英语不够好,无法让我的观点更清晰。 我是OOP的新手,我并没有想要实现所有的S.O.L.I.D.原则。我正在努力的是要理解  我在哪里?  2.我想从哪里来?  OOP怎样才能让我到达那里?

编辑: 在我的实际项目中,我正在实例化父代(我的代码的最后两行)。父母决定(通过解析$ _GET)实例化哪个孩子:B,C或D

我通过更改B的构造函数来解决问题...感谢@ A.P.的提示

public function __construct() {
    parent::init();
    $this->init();
    $this->content = $this->m.' '.$this->n.' '.$this->p.' '.$this->x.' (according to '.$this->x.')';
}

1 个答案:

答案 0 :(得分:1)

贝娄是我纠正你做你想做的事。但是你不能创建一个A类并期望它从B类(这是一个孩子)获取数据 但是您可以从B类

访问A类的构造函数
    class A
{
    protected $m;
    protected $n;
    protected $p;
    protected $content;

    public function __construct() {
        $this->init();
    }

    private function init() {
        $this->m = 'Nobody';
        $this->n = 'is';
        $this->p = 'like';
    }

    public function getContent() {
        return $this->content;
    }
}

class B extends A
{
    protected $x;

    public function __construct() {
        parent::__construct();
        $this->init();
        $this->content = $this->m.' '.$this->n.' '.$this->p.' '.$this->x.' (according to '.$this->x.')';
    }

    private function init() {

        $this->x = 'Donald Trump';
    }

     public function getContent() {
        return $this->content;
    }
}

$B = new B;
echo $B->getContent();