对我而言,PHP中的暗示类型应该包括该类型的所有派生词似乎相当简单。但是,我遇到了错误,我想知道我是否误解了这一点,或者我是否只是做错了。这是我的简单测试用例:
<?php
interface A { }
interface A1 extends A { } // A1 is a specific type of A
interface B {
function test(A $a); // B::test requires an object of type A
}
class ConcreteB implements B {
function test(A1 $a) {
echo "cha";
}
}
?>
这个程序显然没有做任何事情,但它足以证明问题:当我“运行”它时,PHP会抛出一个Fatal error: Declaration of ConcreteB::test(A1 $a) must be compatible with B::test(A $a)
。
从理论上讲,由于A1
是A
的一种类型,因此您可以在A
上调用任何A1
函数,因此这两个声明应该被视为兼容。因此保留了多态性。
有关为什么我收到此错误的任何想法?
答案 0 :(得分:0)
啊,我刚刚意识到你的接口需要一个不同的参数。
请参阅
Override method parameter with child interface as a new parameter
获得最佳答案。