【问题标题】:PHP OOP "Implementation must be compatible" [duplicate]PHP OOP“实现必须兼容”[重复]
【发布时间】:2012-01-14 14:34:28
【问题描述】:

我在 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 - 我错过了什么吗?我应该如何实现这种功能?

【问题讨论】:

  • 我不同意这是兼容的,您的interface I 表示method 接受任何 AC 的合同,而不仅仅是C... 我会同意InterfaceImplementation 实际上并没有实现I

标签: php oop


【解决方案1】:

假设你有一个类B,它也扩展了AC。然后I 要求它的任何实现也接受B 作为方法的参数。但是,您的 InterfaceImplementation 没有。

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

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

【讨论】:

  • 它将接受B 的......除非你的意思是B 扩展AC,在这种情况下你是正确的。
  • 对不起,是的意思是说“extebs AC”而不是“扩展 C”——已修复
【解决方案2】:

只要定义为:

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

并用 C 的实例调用它,即。 ->method(new C());.

Object Interfaces 上的 PHP 参考手册明确指出:

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

【讨论】:

  • 是的,但我猜他想限制 InterfaceImplementation 只接受 C 参数
猜你喜欢
  • 2013-10-08
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 2017-09-21
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多