Php 我必须调用构造函数第一行中的parent::\u construct()?

Php 我必须调用构造函数第一行中的parent::\u construct()?,php,oop,Php,Oop,我知道在Java中,构造函数中的super()必须作为重写构造函数的第一行调用 这是否也适用于PHP中的父::u construct()调用 我发现自己编写了一个异常类,如下所示: class MyException extends Exception { public function __construct($some_data) { $message = ''; $message .= format_data($some_data); $message .=

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

这是否也适用于PHP中的
父::u 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中是否会被视为一个错误/糟糕的做法。

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

如果希望执行父类构造函数中的代码,则需要在某个点调用父类::\u construct(…)。从技术上讲,你这样做并不重要。有时在调用父构造函数之前在重写构造函数中做一些工作更有意义,有时在可以在重写构造函数中工作之前依赖父构造函数所做的工作

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

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

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

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

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

将给定的答案加倍:是的,您可以完全省略
父项::u construct
;是的,您可以在子类的
\u构造
函数中的任何位置调用它。任何方法都是好的,只要它是有意义的,并且是一致的


例如,如果您有一个具有三个子类的父类,并且每个子类都以自己的方式使用
父::\u construct
调用,那么它可能是一个标志,表明继承性不太清楚,应该进行重构。

不,它不必作为第一行调用。正如您在案例中所发现的,它不是第一行通常是有意义的。如果您在谷歌上搜索任何与PHP OOP相关的内容,您会发现,在第一段中它有您的答案。扩展异常实际上是一个很好的例子,您可能不想首先调用父构造函数;例如,如果您滚动了一个多语言自定义异常,请将特定错误代码传递给它,它将在将消息传递给父构造函数之前检索相关语言的消息。。。所以,不,这不是一个坏做法。不错的做法提出了第一行标准,你可以在构造函数的代码中的任何地方调用它。接受你的答案,因为它是投票率最高的,而且似乎是一个很好的建议,尽管我希望得到一个答案,详细说明为什么Java中的规则不适用于PHP,但我不能回答这个问题,因为我不懂Java。在PHP中,
\uuu construct
与任何其他方法一样,它只是做了一些事情,不管你让它做什么,无论你何时调用它都无关紧要。它唯一的特殊之处在于它是在对象构造时执行的。