【发布时间】:2016-05-12 07:16:27
【问题描述】:
Object Interfaces 上的 PHP 手册说:
实现接口的类必须使用与接口中定义的完全相同的方法签名。不这样做会导致致命错误。
不考虑以下情况:我有一个接口
interface Foo
{
public function foo(SpecialClass $object);
}
它只包含一个方法foo,它以SpecialClass 作为参数,以及一个具体的类
class Bar
{
public function foo(BaseClass $object)
{
// do something with $object
}
}
除了foo 采用BaseClass 之外,它与Foo 具有相同的签名,其中SpecialClass implements BaseClass。
从理论上来说,每当我的代码需要满足Foo 接口的需求时,我都可以使用Bar 的实例,并且一切都应该正常工作(因为SpecialClass 是BaseClass)。换句话说,Bar 满足Foo 声明的契约,因为它有一个方法foo 可以处理任何SpecialClass 对象。
为了明确这一点,并能够在我的代码中实际使用它,我希望能够编写 Bar implements Foo,但如文档中所述,这会引发致命错误。
这个致命错误的原因是什么?只是因为目前是这样做的,还是有特定的理由这样做?
【问题讨论】: