【问题标题】:calling parent constructor inside child constructor在子构造函数中调用父构造函数
【发布时间】:2018-01-31 23:56:01
【问题描述】:

我只是想知道创建一个子类构造函数只是为了调用父构造函数是否是个好主意。

class A {
  public function __construct() {
      echo 'I am in: '.__CLASS__.'<br/>';
  }
  public function getData() {
      echo 'I am in: '.__METHOD__.'<br/>';
  }
}

class B extends A {

  public function __construct() {
      parent::__construct();
      echo 'I am in: '.__CLASS__.'<br/>';
  }

  public function getDataFromB(){
      echo 'I am in: '.__METHOD__.'<br/>';
  }
}

$objB = new B();
$objB->getDataFromB();

现在在下面的例子中我们可以达到同样的效果:

class A {
  public function __construct() {
      echo 'I am in: '.__CLASS__.'<br/>';
    }
  public function getData() {
      echo 'I am in: '.__METHOD__.'<br/>';
    }
}

class B extends A {
  public function getDataFromB(){
      echo 'I am in: '.__METHOD__.'<br/>';
    }
}

$objB = new B();
$objB->getDataFromB();

问题:

仅为调用父构造函数而创建子构造函数是个好主意,还是这样做还有其他好处?

【问题讨论】:

  • 这简直是多余的,句号。
  • 如果你不在子类中重写父构造函数,它会自动被调用。所以除非你打算实现额外的功能,否则它是没有意义的。

标签: php oop inheritance constructor


【解决方案1】:

__construct 在类中调用的行为是:

  1. 如果类有自己的__construct - 它将被调用
  2. 如果类没有自己的__construct - 将调用父类__construct(如果存在)。

因此,如果您在子类中创建__construct,则父类__construct 将不会被调用,除非您使用parent::__construct() 明确指出它。

因此,如果孩子 __construct 不会发生任何严重的事情 - 您可以省略它,而父 __construct 将被调用。

另一方面 - 如果您在子 __construct 中执行一些额外的初始化或其他操作,那么它不会调用 parent::__construct,除非您明确指出它。

【讨论】:

  • 不仅仅是__construct,这是所有方法的相同行为......
  • @deceze 当然,但我们在这里谈论__construct
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多