Oop PHP ClassA::load()必须与InterfaceA::load()兼容

Oop PHP ClassA::load()必须与InterfaceA::load()兼容,oop,Oop,我有一些课程: class ClassA implements InterfaceA { public function load(Foo $foo) { } } interface InterfaceA { public function load(InterfaceFoo $foo); } class Foo implements InterfaceFoo { } 我的问题是为什么我的ClassA::load(Foo$Foo)方法与我的Interfa

我有一些课程:

class ClassA implements InterfaceA {
     public function load(Foo $foo) {

     }
}


interface InterfaceA {
     public function load(InterfaceFoo $foo);
}

class Foo implements InterfaceFoo
{

}
我的问题是为什么我的ClassA::load(Foo$Foo)方法与我的InterfaceA::load(InterfaceFoo$Foo)不兼容,即使类Foo实现了InterfaceFoo

我知道我可以写我的ClassA如下:

class ClassA implements InterfaceA {
     public function load(InterfaceFoo $foo) {
             if (!($foo instanceof Foo)) {
                 throw new Exception("InterfaceFoo must be an instance of Foo");
             }
     }
}

但是我仍然不明白为什么前面的方法不起作用。

你不能这样做,因为它违反了InterfaceA合同

load
方法表示它可以与InterfaceFoo的任何具体实现一起工作,而不仅仅是特定的实现。 这就是所谓的多态性,是好的


您可以在load方法中友好地向下转换foo param,以检查它是否是像foo这样的具体实现。

就像我在第二部分中所做的那样?其中我检查
是否(!($foo instanceof foo)){