PHP:对象A扩展了对象B,它们共享一个构造函数吗?

时间:2013-02-17 10:27:45

标签: php inheritance

在PHP中,当对象B扩展对象A时,为什么对象的B实例化不会自动触发对象A中的__construct()

在Object B的构造函数中,我有两个重复Object A的构造函数,这似乎很奇怪。我犯了错误吗?或滥用继承?

4 个答案:

答案 0 :(得分:2)

如果未实现新的__construct方法,则会自动调用A类中的构造函数。如果你想在B中创建一个新的构造函数并且还要从A类调用旧的构造函数,你必须调用parent::__construct(yourparams,...)

答案 1 :(得分:2)

您无需复制代码。

如果没有定义B的构造函数,那么它将采用A的构造函数。

如果是,那么你需要将构造调用链接回A,就像这样。

class A {

    function __construct(...) {
        //do something
    }
}

class B extends A {

    function __construct(...) {
        parent::__construct(...);
        //do something more
    }
}

答案 2 :(得分:1)

如果子类没有显式构造函数,则隐式运行超类构造函数。

如果子类确实有一个显式构造函数,那么它将覆盖超类中的构造函数,因此您可以在必要时完全更改子类实例化行为。

如果要向子类添加其他实例化行为但仍希望保留超类行为,则应执行以下操作:

public function __construct ($arg) {
    parent::__construct ($arg);
    // Additional construction logic goes here
}

答案 3 :(得分:0)

您需要从子类的构造函数中调用parent :: __ construct(),因为不会隐式调用父构造函数。

看看这个

http://php.net/manual/en/language.oop5.decon.php