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

为什么PHP不自动调用父构造函数?,php,oop,inheritance,Php,Oop,Inheritance,这个问题相当直截了当。在C++中,父构造函数将在子构造函数之前隐式调用,那么PHP不应该用什么逻辑来这样做? 编辑:我从卢克曼那里得到了一个很好的答案,但我希望找到更多的原因来解释为什么会有不同。也许问题应该是C++为什么不允许父构造函数的自定义调用?不过我想这是另一个问题。我认为PHP让您手动调用父级构造函数是件好事,因为它允许子级构造函数,例如: public function __construct() { // set up variables that parent::__con

这个问题相当直截了当。在C++中,父构造函数将在子构造函数之前隐式调用,那么PHP不应该用什么逻辑来这样做?
编辑:我从卢克曼那里得到了一个很好的答案,但我希望找到更多的原因来解释为什么会有不同。也许问题应该是C++为什么不允许父构造函数的自定义调用?不过我想这是另一个问题。

我认为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();
}
甚至:

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();
}

也就是说,您可以在子构造函数中的任何位置自由调用父构造函数,并且可以在调用之前和之后自由地进行操作。这真的不是一个特性吗?

为了避免紧密耦合,这就是为什么继承(java中的extend关键字)是邪恶的,并且更喜欢接口类参见Javaworld文章:


尽管如此,如果有一些指示,可以在某个时候用一个特殊的关键字(如forward)给家长打电话,那就太好了,但我还没有在任何语言(甚至Rebol)中看到过这种情况,除了保罗·艾伦(是微软的联合创始人)发明的一种未知语言之外这是Openscript。

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


如果决定向子类添加构造函数,那么当然需要显式调用父构造函数。如果您已经在花时间向子类添加构造函数,那么再添加一行代码
parent::u construct()似乎没什么大不了的。但是覆盖实际上是一种方便的灵活性。

是的,我理解!我确信语言上的差异影响了给父母打电话或不打电话的决定——我想知道原因。这有点像说“为什么狗不嘎嘎?”:“因为它们不是鸭子。”2斯基尔德里克:看起来这是问题的答案:)因为这是一种应该避免的糟糕语言。PHP是糟糕设计的一个分形eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design。C++通过“用空的”重载CtoR并通过该签名继承来“允许您”。构造函数应该按照它在tin上所说的去做,当对象被构造时应该调用它,并且应该构造对象,如果它没有,那么它就忘记了它的目的。PHP充满了这样的怪癖,只是真的没有任何好的理由支持它们,说真的。学习C#需要任何帮助吗?问问。调用家长的方法?很多面向对象语言都有这种功能。类似于PHP中的代码>父/代码>前缀,在Python中使用代码> >(),代码<爪哇>代码>超级代码>,甚至使用父类名称,如<代码> BaseClass::方法()/c++在C++中。所有OOP都有OOP的一部分:这并不意味着你应该过度使用它。继承是邪恶的?什么?你是说蛇和长颈鹿都是动物,你不应该继承任何动物类的属性,而是。。。什么?创建一个接口,该接口有一个表示指向动物的指针的方法?什么?这是怎么回事?嘘。不要让我对人们说“多重继承不应该存在”,在现实生活中,它是合乎逻辑的。它们是罕见的,但确实存在。@Jimmyt1988对于动物的特殊情况,使用遗传是完全有效的。然而,在编写真实世界的应用程序时,拥有此类域对象并不常见。在这些场景中,开发人员经常说“我将扩展这个类,所以我不需要重新实现这个逻辑”。这是在以一种不应该的方式利用继承used@Fermin席尔瓦-所以你是说,当你做一个关于动物,或外来物种,或船只,或任何其他离开这个世界物体的游戏时,你不会发现它有用,甚至。。。有意义吗?那些你不想从金属中继承的材料,比如钛和合金呢?或者像裤子和裙子这样的服装不想从服装中继承?这就是buddy的风格,几乎在我写的每一个程序/游戏中都会出现。看到区别了吗,汽车不是从引擎继承的,它没有意义。它包含一个引擎,当您有指针时。请注意,只有在构造函数体尚未包含对父构造函数的显式调用时,才可以轻松地自动调用父构造函数。基类需要子类进行初始化,然后才能对其自身进行初始化…:O我强烈建议在这种情况下的任何人重新考虑他们的应用程序设计。再说一次,PHP对潜在的乱七八糟的因素没有限制,这是不好的,因为在实例化对象时应该始终调用构造函数。在整个继承周期中,继承的对象类型被实例化,但有一个标志表明不应触发构造函数。这违反了一般的构造函数规则并导致混淆(证据在OP中)。另一方面,诸如C++或C++之类的语言可以通过隐式地请求构造函数来延迟执行构造函数,而不是破坏实例化调用构造函数的默认规则。这是PHP中非常愚蠢的一部分,应该加以解决。@developerbmw-请三思。如果为该任务提供了构造函数,为什么要创建“实例化所需对象”的函数。事实上,甚至PHP文档也指出:“它适用于对象在使用之前可能需要的任何初始化。”。请不要向他人提出任何建议,因为您可能误导了他们。这是对PHP的一个根本性的疏漏,对于该语言的新手来说,这是一个令人困惑的问题。它应该被解析并设置为PHP的配置,这样遗留代码就不会被破坏。@developerbmw:也许您忘记了有两种类型的继承;泛化与专门化