当派生类被实例化时,抽象类构造函数是不是被隐式调用的?

以这个例子:

abstract class Base { function __construct() { echo 'Base __construct<br/>'; } } class Child extends Base { function __construct() { echo 'Child __construct<br/>'; } } $c = new Child(); 

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

基地__结构
孩子__构造

但是,实际产出是正义的

孩子__构造

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

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

 parent::__construct(); 

传递参数,如果需要的话。

一般来说,你会在子类的构造函数的开始,在任何特定的代码之前这样做; 这意味着,在你的情况下,你会有:

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

而且,作为参考,您可以看一下PHP手册的这个页面: 构造器和析构器 – 它声明(引用)

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

那么,我刚刚在文档中find了这个:

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

如果你需要和C#一样的行为,那就是父构造函数总是在子构造函数之前被执行,你可以为你的子类创build一个假构造函数类,并在抽象父类中声明它为抽象函数。

例如

 abstract class Test{ abstract public function __childconstruct(); public function __construct(){ echo "SOME CODE".PHP_EOL; $this->__childconstruct(); } } class TestExtended extends Test{ public function __childconstruct(){ echo "SOME OTHER CODE FROM EXTENDED CLASS".PHP_EOL; } } $a = new TestExtended(); /* SOME CODE SOME OTHER CODE FROM EXTENDED CLASS */