在实例化派生类时,抽象类构造函数是否未隐式调用?

2022-08-30 09:20:42

举个例子:

abstract class Base {
    function __construct() {
        echo 'Base __construct<br/>';
    }
}

class Child extends Base {
    function __construct() {
        echo 'Child __construct<br/>';
    }
}

$c = new Child();   

来自C#背景,我希望输出是

基__construct
子__construct

但是,实际输出只是

儿童__construct


答案 1

否,如果子类定义了构造函数,则不会调用父类的构造函数。

从子类的构造函数中,您必须调用父类的构造函数:

parent::__construct();

如果需要,传递参数。

通常,您将在子类的构造函数的开头,在任何特定代码之前执行此操作;这意味着,在你的情况下,你会有:

class Child extends Base {
    function __construct() {
        parent::__construct();
        echo 'Child __construct<br/>';
    }
}


而且,作为参考,您可以查看PHP手册的此页面:构造函数和析构函数 - 它指出(引用):

注意:如果子类定义了构造函数,则不会隐式调用父构造函数。
为了运行父构造函数,需要在子构造函数中调用。parent::__construct()


答案 2

好吧,我刚刚在文档中发现了这一点:

注: 如果子类定义了构造函数,则不会隐式调用父构造函数。为了运行父构造函数,需要在子构造函数中调用 parent::__construct()。


推荐