我是否必须在构造函数的第一行调用 parent::__construct()?

2022-08-31 01:05:51

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

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

我发现自己在写一个异常类,如下所示:

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中是否会被认为是一个错误/不良做法。


答案 1

如果要执行父构造函数中的代码,则需要在某个时候调用。从技术上讲,当您这样做,这并不重要。有时,在调用父构造函数之前,在被覆盖的构造函数中做一些工作更有意义,有时,在重写的构造函数中完成工作之前,您依赖于父构造函数所做的工作。parent::__construct(…)

根据经验,我认为您应该尽快调用父级的构造函数。如果需要先执行某些操作,然后才能调用父级的构造函数,请执行此操作。如果没有,请立即致电。这是为了避免父构造函数撤消您在重写的构造函数中执行的任何工作,例如设置某些属性。

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

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

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


答案 2

主要问题不是对父构造函数的调用是否应该在第一行执行,或者根本不执行。相反,这是关于什么可以被认为是更好的实践以及为什么。

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

例如,如果你有一个包含三个子级的父类,并且每个子类都以自己的方式使用调用,那么它可能是一个标志,表明继承不太清楚,应该重构。parent::__construct


推荐