20

PHP Constructors and Destructors 文档中它指出

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

但是如果子类不调用构造函数,还会调用父构造函数吗?还是我们应该创建一个调用父构造函数的构造函数?

IE:

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

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

2 回答 2

19

也许这有点明显,但做了一些环顾四周,令人惊讶的是,这个问题的直接答案并不容易找到,所以这里是:

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

在下面的示例中,$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();
于 2012-10-29T00:43:09.020 回答
6

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

于 2012-10-29T01:04:18.287 回答