在现代版本的PHP(下面的5.6)中,以下是无效的程序
error_reporting(E_ALL);
class A
{
public function hello(X $one, Y $two)
{
}
}
class B extends A
{
public function hello()
{
}
}
interface X
{
}
interface Y
{
}
$b = new B;
PHP将拒绝运行此命令,而是给您一条错误消息,如下所示
PHP Strict standards: Declaration of B::hello() should be compatible with A::hello(X $one, Y $two) in test.php on line 15
Strict standards: Declaration of B::hello() should be compatible with A::hello(X $one, Y $two) in test.php on line 15
从严格的角度来看,这是一件好事。但是,如果您使用构造函数
尝试相同的操作class A
{
public function __construct(X $one, Y $two)
{
}
}
class B extends A
{
public function __construct()
{
}
}
PHP没有问题,将运行该程序。
有谁知道为什么严格的标准不适用于施工人员的历史和/或技术背景?
答案 0 :(得分:4)
来自PHP Manual:
注意:如果子类定义了构造函数,则不会隐式调用父构造函数。为了运行父构造函数,需要在子构造函数中调用parent :: __ construct()。如果子进程没有定义构造函数,那么它可以像普通的类方法一样从父类继承(如果它没有被声明为私有)。
此外:
与其他方法不同,当使用与父__construct()方法不同的参数覆盖__construct()时,PHP不会生成 E_STRICT 级错误消息。
如果在所有扩展类上都需要相同的构造函数签名,那么继承的有用性将基本上被破坏。你能想象在应用程序的每个控制器上都需要相同的构造函数签名吗?