PHP OOP“;实施必须兼容”;

PHP OOP“;实施必须兼容”;,php,oop,Php,Oop,我在PHP OOP和类型提示方面遇到了奇怪的问题。下面是一个例子: abstract class AC {} class C extends AC {} interface I { function method(AC $abstract); } class InterfaceImplementation implements I { function method(C $concrete) {} } 此代码不会运行,说明方法与接口声明不兼容。我认为它是兼容的,因为C扩展

我在PHP OOP和类型提示方面遇到了奇怪的问题。下面是一个例子:

abstract class AC {}

class C extends AC {}

interface I {
    function method(AC $abstract);
}

class InterfaceImplementation implements I {
    function method(C $concrete) {}
}

此代码不会运行,说明
方法
与接口声明不兼容。我认为它是兼容的,因为C扩展了AC-我会错过什么吗?我应该如何实现这种功能?

想象一下,您有一个类
B
,它也扩展了
AC
。然后,
I
要求它的任何实现也接受
B
作为方法的参数。但是,您的
界面实现

更重要的是:如果需要在实现中指定具体类型,您可能需要重新考虑您的设计。这个想法是,对于外界来说,所有需要知道的都是由
AC
编码的,并且不应该有一个
接口实现
需要知道哪个具体的子类正在被传输。也许特定的内容可以嵌入到
C
的代码中,并通过
AC?

还有一个更新:您可以使用泛型实现您想要的功能,但我认为PHP中不存在泛型。我仍然认为,如果您分享设计问题的细节,可能会提出另一个有趣的问题:)

只需将其定义为:

class InterfaceImplementation implements I {
    function method(AC $concrete) {}
}
并用一个C实例调用它,即
->method(newC())

PHP参考手册中明确指出:

实现接口的类必须使用与接口中定义的方法签名完全相同的方法签名。不这样做将导致致命错误


我不同意这是兼容的,您的
接口I
表示合同
方法
接受任何
AC
,而不仅仅是
C
。。。我同意,
InterfaceImplementation
实际上没有实现
I
。它将接受
B
。。。。除非你的意思是
B
extends
AC
,在这种情况下你是正确的