请仔细查看以下两个代码块。产生的错误和警告位于相应的代码块下方。
对我来说似乎很有趣!我认为两者应该以相同的方式进行操作,并且在我看来在逻辑上是有效的,因此不应发出任何错误或警告。
这是 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
答案 0 :(得分:0)
我想我自己找到了答案。
由于继承的接口可以具有其他声明(继承的类型可以具有其他属性),因此它们在逻辑上是完全不同的,因此PHP发出的错误/警告是绝对正确的。
感谢您阅读问题和答案。希望这可以帮助其他人更好地理解接口作为类型的使用。
答案 1 :(得分:0)
好消息!第一部分将从PHP 7.4开始运行。 :-)