为什么PHP不会自动调用父构造函数?

Ski*_*ick 27 php oop inheritance

相当直截了当的问题.在C++中,父构造函数将在子构造函数之前被隐式调用,那么PHP有什么逻辑不以这种方式做事?

编辑:我得到了Lukman的一个很好的答案,但我希望有更多的原因可以解决这个问题.也许问题应该是为什么C++不允许自定义调用父构造函数?我猜这是另一个问题.

Luk*_*man 25

我认为PHP让你手动调用父的构造函数是件好事,因为它允许子的构造函数如下:

public function __construct() {
   // set up variables that parent::__construct() requires
   $var1 = get_stuff_from_db();
   $var2 = get_stuff_from_webservice();

   parent::__construct($var1, $var2);

   // continue setting up $this var
   $this->default = 'Default';
   $this->do_some_secret_stuff();
}
Run Code Online (Sandbox Code Playgroud)

甚至:

public function __construct($param) {
   // call differently based on condition
   if (is_array($param))
      $param['id'] = 0;
      parent::__construct($param);
   }
   else {
      parent::__construct($param, 0, TRUE);
   }

   // continue setting up $this var
   $this->default = 'Default';
   $this->do_some_secret_stuff();
}
Run Code Online (Sandbox Code Playgroud)

这意味着,您可以自由地在子项内的任何位置调用父构造函数,并且您可以在调用之前和之后自由地执行操作.这不是一个功能吗?

  • @developerbmw:也许您忘记了继承有两种类型;通用化和专业化。当您使用子类扩展父类时,这是专业化,它不会使子类构造函数显式调用父类构造函数。但是,当您实现泛化(在基类中分解出常见功能)时,这可能是一个有效的用例。其次,在 ORM 中,实体对象在不调用构造函数的情况下被水合。我从 PHP 为程序员提供的灵活性中看到了智慧。 (2认同)

pro*_*mer 8

如果子类中没有构造函数,则会自动调用父类.

如果您决定向子类添加构造函数,那么您当然需要显式调用父构造函数.如果您已经花时间为子类添加构造函数,那么添加一行代码parent::__construct();似乎不是什么大问题.但最重要的是实际上是一种方便的灵活性.

  • PHP是唯一一种可以被称为"方便的灵活性"的糟糕设计语言:D (3认同)