为什么"严格标准"不适用于PHP构造函数?

时间:2016-01-12 19:15:44

标签: php oop

在现代版本的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没有问题,将运行该程序。

有谁知道为什么严格的标准不适用于施工人员的历史和/或技术背景?

1 个答案:

答案 0 :(得分:4)

来自PHP Manual

  

注意:如果子类定义了构造函数,则不会隐式调用父构造函数。为了运行父构造函数,需要在子构造函数中调用parent :: __ construct()。如果子进程没有定义构造函数,那么它可以像普通的类方法一样从父类继承(如果它没有被声明为私有)。

此外:

  

与其他方法不同,当使用与父__construct()方法不同的参数覆盖__construct()时,PHP不会生成 E_STRICT 级错误消息。

如果在所有扩展类上都需要相同的构造函数签名,那么继承的有用性将基本上被破坏。你能想象在应用程序的每个控制器上都需要相同的构造函数签名吗?