如果子类未定义构造函数,是不是会调用父构造函数?
Posted
技术标签:
【中文标题】如果子类未定义构造函数,是不是会调用父构造函数?【英文标题】:Are parent constructors called if a child class does NOT define a constructor?如果子类未定义构造函数,是否会调用父构造函数? 【发布时间】:2012-10-18 08:27:58 【问题描述】:在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();
【问题讨论】:
【参考方案1】:也许这有点明显,但做了一些环顾四周,令人惊讶的是,这个问题的直接答案并不容易找到,所以这里是:
如果子类不定义了一个构造函数,那么父构造函数就会被调用。
在下面的示例中,$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();
【讨论】:
也许the manual 最近更新了,但它确实声明,“如果子类没有定义构造函数,那么它可能像普通类方法一样从父类继承(如果它未声明为私有)。” 你甚至可以将构造函数声明为私有的吗?这似乎违背了最初开设课程的目的。 @eggmatters:检查私有构造函数的答案:***.com/a/2816139/1488445【参考方案2】:考虑到构造函数是一种可以像任何其他方法一样被覆盖的方法。如果父类有构造函数,它的所有子类都将继承该构造函数。如果子代重写构造函数,则在创建新对象时将使用 this,并且不会隐式调用父代的构造函数。如果子级没有覆盖构造函数,则将使用父级的构造函数。这个概念适用于多重继承。
【讨论】:
以上是关于如果子类未定义构造函数,是不是会调用父构造函数?的主要内容,如果未能解决你的问题,请参考以下文章