PHP> 5.4:使用不同的签名覆盖构造函数

lxg*_*lxg 4 php oop constructor

我们知道PHP不接受与父代签名不同的子代方法。我认为这是同与构造函数:PHP文档的状态

这也适用于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();
Run Code Online (Sandbox Code Playgroud)

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

在PHP 5.6.4上进行了尝试。与其他版本相同的效果。

那么,那是怎么回事?尽管文档中有说明,但不同的构造方法签名仍然合法吗?还是这将在以后的版本中修复?

Jos*_*e B 5

根据文档

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

因此,这就是为什么您没有得到E_STRICT级错误的原因。也许它将在不同层面上触发某些事情。