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

PHP ClassA::load() must be compatible with InterfaceA::load()

我有一些 classes:

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) 不兼容,即使 class 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 的任何具体实现一起使用,而不仅仅是特定的实现。 这称为多态性并且很好。

您可以在加载方法中动态向下转换 foo 参数,以检查它是否是像 Foo 这样的具体实现。