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

Type-hinted interface methods not accepting derivative types

提问人:kael 提问时间:10/26/2016 更新时间:10/26/2016 访问量:62

问:

在我看来,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)

从理论上讲,由于 是 的一种类型,因此这两个声明应该被视为兼容的,因为您将能够调用任何函数,因此保留了多态性。A1AAA1

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

PHP的

评论


答:

0赞 WEBjuju 10/26/2016 #1

啊,我刚刚意识到你的界面需要一个不同的论点。

请看

使用子接口作为新参数覆盖方法参数

以获得最出色的答案。

评论

0赞 kael 10/26/2016
哎呀,当然。这不起作用的原因可以更清楚地解释:并且在涉及依赖关系时应该保持可互换。虽然这在上升时有效(所有期望都可以使用),但它在下降时不起作用(并非所有期望都可以使用)。我不完全确定这是否真的是理想的,但有明确定义的规则是有价值的,所以我想我不能抱怨。ConcreteBBBConcreteBConcreteBB