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

15

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

<?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**

例如,Java类具有默认的无参构造函数。即使没有显式定义,它也可以被调用。

当我们从父类中删除无参构造函数时,PHP的行为可能会引起问题,例如当我们认为它不再需要时。

有人知道为什么PHP创造者会这样做吗?


1
除了你的问题之外,应该提到你可以解决这个问题:在调用之前检查函数是否存在。 - Yaakov Shoham
6
PHP的创作者做了许多愚蠢的决定... - Karoly Horvath
1
如果(is_callable('parent::__construct')) { parent::__construct(); } - Oliver Konig
4个回答

24

Java类具有默认的无参构造函数。

有人知道为什么PHP的创建者会这样做吗?

Java是一种计划语言。它从一开始就进行了严格的考虑和正式的规定。它旨在以最少的变化,为了向前和向后兼容性,简单性对于开发人员和实现人员来说尽可能长久存在。他们并没有完全达到自己希望的程度,但您仍然可以编译和运行现代VM上的Java 1.0代码。

PHP的设计者从未计划将语言发展到如此极端。他们随心所欲地制定。不管好坏,他们都很愿意在下一个版本中将语言分解并重建。自PHP 1和2以来,它已经发生了无法辨认的变化。甚至最近,在PHP 5中,您也将对象的按值传递语义大幅更改为按引用传递。正是这种出色的方法论带给我们魔术引号,缺乏Unicode,命名不一致(并经常被重命名)的函数,以及即使使用error_reporting(-1);,也能快乐地将数字文字09解释为0的解析器,没有任何错误提示。

从父类中删除无参构造函数可能会导致PHP行为出现问题,例如当我们认为不再需要它时。

您可以在bugs.php.net上请求更改此问题,但有机会他们会忽略它或用“很抱歉,但您的问题并未暗示PHP本身存在问题...”来敷衍您。


4

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

  • 企业备份不在同一联盟中(没有Oracle、IBM等)
  • PHP很老,有时不一致
  • 支持太多遗留结构和编程范式,PHP解释器(Zend Engine)必须能够做很多事情。
  • PHP的起源是一个简单的脚本语言,供业余爱好者使用。

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

  1. 永远不要这样做,只需清空构造函数
  2. 如果您正在构建框架,请使init函数成为核心概念,因为这些甚至是良好的实践。

我的意思是这个:

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

1

这一行

parent::__construct();

这是对父类构造函数的显式调用。"PHP"会报错,因为它不存在。

在Java中,你真的可以显式调用一个不存在的父类构造函数而不会出错吗?

请记住,当子类被构造时,它继承的父类的构造函数将被覆盖。调用父类构造函数意味着你期望它做一些事情。如果构造函数不存在,则你对它的调用无论解释器是否报错都不应该存在于代码中。


1
在Java中,没有没有构造函数的类 - 如果源代码中没有编写,则编译器会添加一个。请参见https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9。 - bdsl

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接