我必须在构造函数的第一行调用parent :: __ construct()吗?

时间:2016-09-28 12:56:22

标签: php oop

我知道在Java中,构造函数中的super()必须被调用为重写构造函数的第一行。

这是否也适用于PHP中的parent::__construct()调用?

我发现自己写了一个这样的Exception类:

class MyException extends Exception {

  public function __construct($some_data) {

    $message = '';
    $message .= format_data($some_data);
    $message .= ' was passed but was not expected';

    parent::__construct($message);
  }

}

我想知道这是否会被认为是PHP中的错误/错误做法。

3 个答案:

答案 0 :(得分:10)

如果您希望执行父构造函数中的代码,则需要在某个时刻调用parent::__construct(…) 时,它在技术上并不重要。有时在调用父类的构造函数之前在重写的构造函数中做一些工作更有意义,有时你依赖于父类的构造函数所做的工作,然后才能在重写的构造函数中工作。

根据经验,我会说你应该尽快调用父母的构造函数 。如果在调用父构造函数之前需要执行某些操作,请执行此操作。如果没有,请立即拨打电话。这是为了避免父的构造函数撤消您在重写的构造函数中所做的任何工作,例如设置某些属性。

class A {
    function __construct() {
        $this->foo = 'bar';
    }
}

class B extends A {
    function __construct() {
        // parent::__construct();
        $this->foo = 'baz';
        // parent::__construct();
    }
}

在上面的示例中,调用父项的第一个或最后一个之间的差异会对结果对象产生很大的影响。哪个更合适取决于你想要做什么。

答案 1 :(得分:0)

主要的问题不是对父构造函数的调用是应该在第一行执行还是执行。相反,它可以被认为是更好的实践和原因。

给出的答案加倍:是的,你可以完全省略parent::__construct;是的,你可以在子类的__construct函数内的任何地方调用它。任何方法都是好的,只要它有意义并且一致

例如,如果您有一个包含三个孩子的父类,并且每个孩子都以自己的方式使用parent::__construct调用,则可以成为继承不是的标志太清楚了,应该重构。

答案 2 :(得分:-1)

如果你想在父的构造函数中执行代码,那么答案是肯定的。如果子类覆盖父的构造函数,则应该省略它。