当将继承的接口用于类型提示时,PHP为什么会发出兼容性错误?

时间:2019-09-30 02:16:38

标签: php interface compatibility type-hinting

请仔细查看以下两个代码块。产生的错误警告位于相应的代码块下方。

对我来说似乎很有趣!我认为两者应该以相同的方式进行操作,并且在我看来在逻辑上是有效的,因此不应发出任何错误或警告。

这是 PHP错误,还是我丢失了某些东西?

顺便说一句,我相信问题和代码非常简单且不言自明,因此我不再作进一步解释。 :-)

interface A {}

interface B extends A {}

class X implements A {
    public function test() : A {}
}

class Y extends X implements B {
    public function test() : B {}
}

致命错误:Y :: test():B的声明必须与X :: test():A兼容

interface A {}

interface B extends A {}

class X implements A {
    public function test( A $a ) {}
}

class Y extends X implements B {
    public function test( B $b ) {}
}

警告:Y :: test(B $ b)的声明应与X :: test(A $ a

2 个答案:

答案 0 :(得分:0)

我想我自己找到了答案。

由于继承的接口可以具有其他声明(继承的类型可以具有其他属性),因此它们在逻辑上是完全不同的,因此PHP发出的错误/警告是绝对正确的。

感谢您阅读问题和答案。希望这可以帮助其他人更好地理解接口作为类型的使用。

答案 1 :(得分:0)

好消息!第一部分将从PHP 7.4开始运行。 :-)