提问人:kael 提问时间:10/26/2016 更新时间:10/26/2016 访问量:62
类型提示的接口方法不接受派生类型
Type-hinted interface methods not accepting derivative types
问:
在我看来,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赞
WEBjuju
10/26/2016
#1
啊,我刚刚意识到你的界面需要一个不同的论点。
请看
以获得最出色的答案。
评论
0赞
kael
10/26/2016
哎呀,当然。这不起作用的原因可以更清楚地解释:并且在涉及依赖关系时应该保持可互换。虽然这在上升时有效(所有期望都可以使用),但它在下降时不起作用(并非所有期望都可以使用)。我不完全确定这是否真的是理想的,但有明确定义的规则是有价值的,所以我想我不能抱怨。ConcreteB
B
B
ConcreteB
ConcreteB
B
上一个:未在对象方法中捕获异常
评论