PHP关于对象接口的手册说:
实现接口的类必须使用与接口中定义的完全相同的方法签名。不这样做将导致致命错误。
不考虑以下情况:我有一个接口
interface Foo
{
public function foo(SpecialClass $object);
}
它只包含一个方法foo
该方法将SpecialClass
作为参数,以及一个具体的类
class Bar
{
public function foo(BaseClass $object)
{
// do something with $object
}
}
具有相同的签名 Foo
除了foo
采取BaseClass
的事实,其中SpecialClass implements BaseClass
.
从理论上思考,每当我的代码中需要一些东西来满足Foo
接口时,我都可以使用 Bar
的实例,一切都应该工作(因为 SpecialClass 是 BaseClass(。换句话说,Bar
满足Foo
声明的协定,因为它具有能够处理任何SpecialClass
对象的方法foo
。
为了使这一点明确,并能够在我的代码中实际使用它,我希望能够编写Bar implements Foo
,但是如文档中所述,这会带来致命错误。
这个致命错误的原因是什么?仅仅是因为目前的事情是这样做的,还是有特定的原因这样做?
DateTime 不是 StdClass,它们实际上是两个不同的类。
这不是Java,每个人都从对象扩展
如@dynamic DataTime
所述,stdClass
.请看以下示例。
class A {
public function foo();
}
class B extends A {
public function foo();
public function bar();
}
interface C {
public function baz(B $obj)
}
class D implements C {
public function baz(A $obj);
}
您可以看到C
接口的函数baz
采用参数B
。但是,该实现采用参数A
。问题是B
有更多的扩展接口,A
不能满足它。换句话说C
接口需要访问foo()
和bar()
。但A
只有foo()
.如果情况正好相反,事情就会起作用 - B
满足A
的接口。
所以这不是暂时的行为,是正确的行为。