PHP OOP"实现必须兼容"

Flu*_*ffy 5 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) {}
}
Run Code Online (Sandbox Code Playgroud)

此代码将无法运行,表示method与接口声明不兼容.我认为它是兼容的,因为C扩展AC - 我想念一些东西吗?我如何期望实现这种功能?

Nic*_*s78 4

想象一下你有一个类B也扩展了AC。然后I要求它的任何实现也接受B作为方法的参数。InterfaceImplementation然而,你的却没有。

更大的图景:如果您需要在实现中指定具体类型,您可能需要重新考虑您的设计。这个想法是,对于外部世界来说,所有需要知道的内容都是由编码的AC,并且不应该InterfaceImplementation需要知道正在传输哪个具体子类。也许特定的东西可以嵌入到C的代码中,并通过 公开的方法进行一般调用AC?

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