类型提示的接口方法不接受衍生类型

时间:2016-10-25 17:17:19

标签: php

对我而言,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)

从理论上讲,由于A1A的一种类型,因此您可以在A上调用任何A1函数,因此这两个声明应该被视为兼容。因此保留了多态性。

有关为什么我收到此错误的任何想法?

1 个答案:

答案 0 :(得分:0)

啊,我刚刚意识到你的接口需要一个不同的参数。

请参阅

Override method parameter with child interface as a new parameter

获得最佳答案。