扩展了 php 接口的实现


Expanded implementation of php interfaces

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的接口。

所以这不是暂时的行为,是正确的行为。