【问题标题】:Is it mandatory to call parent::__construct from the constructor of child class in PHP?是否必须从 PHP 中子类的构造函数调用 parent::__construct?
【发布时间】:2017-03-07 18:02:11
【问题描述】:

子类构造函数中的构造函数必须调用父类的构造函数吗?

解释一下下面的例子:

class Parent{

    function __construct(){
        //something is done here.
    }

}

class Child extends Parent{

    function __construct(){
        parent::__construct();
        //do something here.
    }

}

像上面那样做是很正常的。但请考虑以下Child 类的构造函数:

function __construct(){
    //Do something here
    parent::__construct();
}

上面的代码正确吗?在调用父级的构造函数之前我们可以做点什么吗?另外,如果我们不在孩子的构造函数中调用父构造函数,如下所示是否合法?

class Child extends Parent{

    function __construct(){
        //do something here.
    }

}

我来自 JAVA,我展示的构造函数类型在 Java 中是不可能的。但是这些可以用 PHP 完成吗?

【问题讨论】:

  • 不,你不必调用父构造函数,是的,你可以在子构造函数中做完之后调用父构造函数。
  • 如果你不扩展(“调用”)父构造函数,你只需覆盖它。

标签: php class inheritance constructor


【解决方案1】:

这是强制性的吗?

没有

上面的代码正确吗?

是的

我们可以在你调用父类的构造函数之前做点什么吗?

是的。你可以按照你喜欢的任何顺序来做。

另外,如果我们不像下面这样在子构造函数中调用父构造函数是否合法?

是的。但它也不是隐式。如果子构造函数不调用父构造函数,那么它将永远不会被调用,因为子构造函数会覆盖父构造函数。如果您的孩子没有构造函数,则将使用父构造函数

【讨论】:

  • 太好了,只需添加此引用php.net/manual/en/language.oop5.decon.php 并突出显示此注释“注意:如果子类定义了构造函数,则不会隐式调用父构造函数。为了运行父构造函数,调用父构造函数::__construct() 在子构造函数中是必需的。如果子构造函数没有定义构造函数,那么它可以像普通类方法一样从父类继承(如果它没有声明为私有)。"
【解决方案2】:

不,调用父构造函数不是必须的,但是如果父构造函数有子类也应该有的副作用,那就很好了。请参阅this phpfiddle,其中一个子类调用父构造函数,但另一个没有。所以如果没有调用父构造函数,它仍然是有效代码。

另外,如果构造函数没有在子类中声明(这会覆盖父构造函数),那么将使用父类的构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多