为什么我不能使用这样的代码?
<?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创建者会这样做?
答案 0 :(得分:22)
Java类有默认值,没有args构造函数。
有谁知道为什么PHP创建者会这样做?
Java是一种计划好的语言。从一开始就严格考虑并正式指定。为了简化开发人员和实现人员,它旨在尽可能长时间地进行最小的更改以实现向后和向前兼容性。绝对没有达到他们希望的程度,但你仍然可以使用Java 1.0代码,编译它并在现代虚拟机上运行它。
PHP的设计人员从未将语言计划得如此极端。他们随着时间的推移弥补起来。无论好坏,他们都愿意将语言分开,并在下一版本中重建它。自从PHP 1和2以来,它发生了无法识别的变化。即使是最近,在PHP 5中,您仍然从对象的by-value到by-reference语义发生了巨大的变化。同样出色的方法为我们带来了神奇的引用,缺少Unicode,不一致命名(和经常重命名)的函数,以及一个甚至没有错误提示的解析器(即使使用error_reporting(-1);
),也会愉快地解释数字文字09
为0
。
当我们从父类中删除没有args构造函数时,PHP行为会导致麻烦,例如。当我们认为不再需要时。
您可以在bugs.php.net上请求更改,但很可能他们会忽略它或者用表示离开“抱歉,但您的问题并不意味着PHP本身存在问题......”
答案 1 :(得分:4)
正如我们在5.3.7 disaster中看到的那样,PHP开发可能需要更多的稳定性。除此之外,PHP在很多方面都有所不同。
我非常喜欢PHP并且每天都在使用它,但有时它只是一个小怪癖。另一方面,如果你删除__construct(),你应该考虑两件事。
我的意思是:
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中显式调用父级不存在的构造函数而不会出错?
请记住,在构造扩展类时,扩展父类的类的构造函数将覆盖父类的构造函数。调用父构造函数意味着您希望它能够执行某些操作。如果构造函数不存在,那么对它的调用不属于代码,无论解释器是否给出错误。