我在PHP OOP和类型提示方面遇到了奇怪的问题。这是一个例子:
abstract class AC {}
class C extends AC {}
interface I {
function method(AC $abstract);
}
class InterfaceImplementation implements I {
function method(C $concrete) {}
}
此代码不会运行,说method
与接口声明不兼容。我认为它是兼容的,因为C扩展AC - 我想念一些东西吗?我如何期望实现这种功能呢?
答案 0 :(得分:4)
想象一下,你有一个B
课,它也扩展了AC
。然后I
要求其任何实现也接受B
作为方法的参数。但是,InterfaceImplementation
没有。
更大的图片:如果您需要在实施中指定具体类型,则可能需要重新考虑您的设计。这个想法是,对于外部世界,需要知道的所有内容都由AC
编码,并且不应该有InterfaceImplementation
需要知道正在传输哪个具体子类。也许特定的东西可以嵌入C
的代码中,通常通过AC?
又一次更新:你可能能够使用泛型实现你想要的东西,但我不认为它们存在于PHP中。我仍然认为,如果你分享可能会产生另一个有趣问题的设计问题的细节:)
答案 1 :(得分:1)
只需将其定义为:
class InterfaceImplementation implements I {
function method(AC $concrete) {}
}
用C的实例调用它,即。 ->method(new C());
。
Object Interfaces上的PHP参考手册明确指出:
实现接口的类必须使用与接口中定义的完全相同的方法签名。不这样做会导致致命错误。