如果子类没有定义构造函数,是否调用父构造函数?

Kir*_*chs 18 php constructor class parent-child

PHP构造函数和析构函数文档中,它说明了这一点

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

但是,如果子类没有调用构造函数,那么父构造函数是否仍会被调用?或者我们应该创建一个调用父构造函数的构造函数吗?

IE:

class BaseClass {
   function __construct() {
       print "In BaseClass constructor\n";
   }
}

class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
   }
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*chs 16

也许这有点显而易见,但做了一些环顾四周,直截了当地回答这个问题并不是很容易找到,所以这里是:

如果子类确实定义构造函数,则父类的构造将被调用.

在下面的示例中,$ obj仍然会从BaseClass调用构造函数,因为SubClass从不调用构造函数.

class BaseClass {
    function __construct() {
       print "In BaseClass constructor\n";
    }
}

class SubClass extends BaseClass {
    //I do not have a constructor :(
}

$obj = new SubClass();
Run Code Online (Sandbox Code Playgroud)

  • 也许 [the manual](http://www.php.net/manual/en/language.oop5.decon.php) 最近更新了,但它确实指出,“如果孩子没有定义构造函数,那么它可以像普通的类方法一样从父类继承(如果它没有声明为私有)。” (2认同)

Al_*_*Al_ 6

考虑构造函数是一种可以像任何其他方法一样被覆盖的方法.如果父类具有构造函数,则其所有子类都将继承该构造函数.如果子项覆盖构造函数,则在创建新对象时将使用此项,并且不会隐式调用父项的构造函数.如果子项不重写构造函数,则将使用父项的构造函数.这个概念适用于多重继承.