PHP> 5.4:覆盖具有不同签名的构造函数

时间:2015-05-26 10:58:17

标签: php oop constructor

我们知道PHP不接受different signature than the parent的子方法。我认为构造函数也是如此:PHP文档states

  

这也适用于PHP 5.4的构造函数。在5.4构造函数签名可能不同之前。

但是,似乎继承的构造函数仍然在PHP版本中可能不同> 5.4。例如,以下代码不会触发任何警告或通知:

class Something { }
class SomeOtherThing { }

class Foo
{
    public function __construct(Something $foo)
    {
    }

    public function yay()
    {
        echo 'yay';
    }
}

class Bar extends Foo
{
    public function __construct($foo, SomeOtherThing $bar = null)
    {
    }
}

$x = new Bar(new Something());
$x->yay();

根据文档,代码应该触发错误,因为构造函数签名不同。

在PHP 5.6.4上尝试过这个。与other versions相同的效果。

那么,那是什么呢?尽管文档说的是什么,不同的构造函数签名仍然合法吗?或者这是一个将在以后的版本中修复的错误?

2 个答案:

答案 0 :(得分:5)

根据documentation

  

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

因此,这就是为什么你没有得到E_STRICT级别的错误。也许它会触发不同程度的东西。

答案 1 :(得分:3)

我认为你有点误读了文档,因为它声明:

  

此外,方法的签名必须匹配,即类型   提示和所需参数的数量必须相同。对于   例如,如果子类定义了一个可选参数,那么   抽象方法的签名没有,没有冲突   签名。

您已经定义了一个可选参数,所以没问题。