我们知道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相同的效果。
那么,那是什么呢?尽管文档说的是什么,不同的构造函数签名仍然合法吗?或者这是一个将在以后的版本中修复的错误?
答案 0 :(得分:5)
与其他方法不同,当使用与父__construct()方法不同的参数覆盖__construct()时,PHP不会生成E_STRICT级错误消息。
因此,这就是为什么你没有得到E_STRICT级别的错误。也许它会触发不同程度的东西。
答案 1 :(得分:3)
我认为你有点误读了文档,因为它声明:
此外,方法的签名必须匹配,即类型 提示和所需参数的数量必须相同。对于 例如,如果子类定义了一个可选参数,那么 抽象方法的签名没有,没有冲突 签名。
您已经定义了一个可选参数,所以没问题。