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

时间:2012-10-29 00:43:09

标签: php class constructor parent-child

PHP Constructors and Destructors documentation声明

  

注意:如果子类,则不会隐式调用父构造函数   定义构造函数。为了运行父构造函数,调用   

是子构造函数中的parent :: __ construct()

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

IE:

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

class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
   }
}

2 个答案:

答案 0 :(得分:16)

也许这有点显而易见,但有些环顾四周,对这个问题的直接回答令人惊讶地发现并不容易,所以这里是:

如果子类 NOT 定义构造函数,则将调用父构造函数。

在下面的示例中,$ 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();

答案 1 :(得分:6)

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