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

sco*_*ttm 62 php abstract-class

举个例子:

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

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

$c = new Child();   
Run Code Online (Sandbox Code Playgroud)

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

Base __construct
Child __construct

但是,实际输出只是

孩子__construct

Pas*_*TIN 104

不,如果子类定义构造函数,则不调用父类的构造函数.

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

parent::__construct();
Run Code Online (Sandbox Code Playgroud)

如果需要,传递参数.

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

class Child extends Base {
    function __construct() {
        parent::__construct();
        echo 'Child __construct<br/>';
    }
}
Run Code Online (Sandbox Code Playgroud)


并且,作为参考,您可以查看PHP手册的这一页:构造函数和析构函数 - 它声明(引用):

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

  • 是:如果子类没有定义构造函数,则父类的构造函数不会被覆盖,因此被调用;;; 引用手册:如果子类定义构造函数**,则不会隐式调用父构造函数**. (10认同)
  • 不会明确声明这一点,但是它们暗示如果子类没有构造函数,则将调用父构造函数。真的吗? (2认同)

sco*_*ttm 6

好吧,我刚刚在文档中找到了这个:

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

  • @RyanWilliams在某些情况下,您需要在类中进行一些额外的初始化之前调用父构造函数,并且有些情况是在额外初始化之后调用父级.因此,PHP允许您支持更多用例. (2认同)