PHP OOP“实现必须兼容”

时间:2012-01-14 14:34:29

标签: 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) {}
}

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

2 个答案:

答案 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参考手册明确指出:

  

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