为什么PHP没有默认构造函数?

时间:2011-10-26 21:20:12

标签: php constructor default-constructor

为什么我不能使用这样的代码?

<?php

class NoConstructor {
}

class ChildWithConstructor extends NoConstructor {
    public function __construct() {
        parent::__construct();
        // do something
    }
}

$foo = new ChildWithConstructor();
// **Fatal error: Cannot call constructor in file.php on line 8**

EG。 Java类有默认值,没有args构造函数。即使没有明确定义,也可以调用它。

当我们从父类中删除没有args构造函数时,PHP行为会导致麻烦,例如。当我们认为不再需要时。

有谁知道为什么PHP创建者会这样做?

4 个答案:

答案 0 :(得分:22)

  

Java类有默认值,没有args构造函数。

     

有谁知道为什么PHP创建者会这样做?

Java是一种计划好的语言。从一开始就严格考虑并正式指定。为了简化开发人员和实现人员,它旨在尽可能长时间地进行最小的更改以实现向后和向前兼容性。绝对没有达到他们希望的程度,但你仍然可以使用Java 1.0代码,编译它并在现代虚拟机上运行它。

PHP的设计人员从未将语言计划得如此极端。他们随着时间的推移弥补起来。无论好坏,他们都愿意将语言分开,并在下一版本中重建它。自从PHP 1和2以来,它发生了无法识别的变化。即使是最近,在PHP 5中,您仍然从对象的by-value到by-reference语义发生了巨大的变化。同样出色的方法为我们带来了神奇的引用,缺少Unicode,不一致命名(和经常重命名)的函数,以及一个甚至没有错误提示的解析器(即使使用error_reporting(-1);),也会愉快地解释数字文字090

  

当我们从父类中删除没有args构造函数时,PHP行为会导致麻烦,例如。当我们认为不再需要时。

您可以在bugs.php.net上请求更改,但很可能他们会忽略它或者用表示离开“抱歉,但您的问题并不意味着PHP本身存在问题......”

答案 1 :(得分:4)

正如我们在5.3.7 disaster中看到的那样,PHP开发可能需要更多的稳定性。除此之外,PHP在很多方面都有所不同。

  • 企业备份不在同一个联盟(没有Oracle,没有IBM等)
  • PHP陈旧,有时不一致
  • PHP的解释器(Zend Engine)必须能够通过支持如此多的遗留构造和编程范例来做很多事情。
  • PHP的起源是一个简单的爱好者脚本语言。

我非常喜欢PHP并且每天都在使用它,但有时它只是一个小怪癖。另一方面,如果你删除__construct(),你应该考虑两件事。

  1. 永远不要这样做,只需清空构造函数
  2. 如果你正在构建一个框架,那么init函数就是一个核心概念,因为这些都是很好的实践。
  3. 我的意思是:

    class BaseClass {
      public function __construct() {
          if(method_exists($this, 'init') {
              $this->init();
          }
      }
    }
    

答案 2 :(得分:1)

在PHP 5之前,构造函数与类具有相同的名称,如JAVA。在PHP 5中,类可以具有与类同名的构造方法(如果不在命名空间中)或名为__construct。 也许它与此有关。

答案 3 :(得分:1)

该行

parent::__construct();

是对父类的构造函数的EXPLICIT调用。 “PHP”给你一个错误,因为它不存在。

您是否可以在Java中显式调用父级不存在的构造函数而不会出错?

请记住,在构造扩展类时,扩展父类的类的构造函数将覆盖父类的构造函数。调用父构造函数意味着您希望它能够执行某些操作。如果构造函数不存在,那么对它的调用不属于代码,无论解释器是否给出错误。