【问题标题】: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();
   }
}

【问题讨论】:

    标签: php class constructor parent-child


    【解决方案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:检查私有构造函数的答案:stackoverflow.com/a/2816139/1488445
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-28
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多