繁体   English   中英

必须在子类之前声明实现接口的类?

[英]Class implementing an interface must be declared before a children class?

我今天偶然发现了一个有趣的问题。 在用于多个声明的单个文件的上下文中,如果类B实现接口A ,并且类C扩展了类A ,则必须C 之前声明类B

以下代码不起作用:

interface A {}
class C extends B {} // Class 'B' not found
class B implements A {}

这解决了它:

interface A {}
class B implements A {}
class C extends B {} // Class 'B' is found

但这很好用:

class A {}
class C extends B {} // Class 'B' is found
class B extends A {}

这些是我在PHP 5.3.8(Win32)和PHP 5.3.3-1ubuntu9.6 w / suhosin上的结果。

所以问题是, 这是记录在案的行为吗? 为什么它适用于类而不是接口? 或者这应该被视为一个错误?

在我深入研究PHP的源代码和/或打开PHP错误票之前,请告诉我您的体验。 :)

谢谢!

注意:我知道这只是课堂申报顺序的问题,但这让我很困惑......如果不合适,请不要犹豫,关闭。

是的,这是记录在案的行为:

对象继承(注)

除非使用自动加载,否则必须在使用之前定义类。 如果类扩展另一个类,则必须在子类结构之前声明父类。 此规则适用于继承其他类和接口的类。

PHP:扩展 - 手册(注)

必须在使用之前定义类! 如果您希望Named_Cart类扩展Cart类,则必须首先定义类Cart。 如果要基于Named_Cart类创建另一个名为Yellow_named_cart的类,则必须首先定义Named_Cart。 简而言之:定义类的顺序很重要。


未定义的行为(添加了讽刺)

即使您的第三个示例可能会说出来,但根据文档说它并没有被说成功(我找不到任何更改日志条目,说明它是一个引入的功能)。

遗憾的是,PHP的文档并非100%,但您只能信任您所知道的内容,而上述引用是我能找到的关于此事的全部内容。

您可能将其称为错误,但在C ++中我们会将其描述为undefined behavior即。 不应该依赖的东西。


如果“标准”(文档)没有提及它,则使用起来并不安全。

如果“标准”(文档)没有提到它,它可能会使宇宙内爆 - 或猛禽跳过你的窗户。 不要做任何可以杀死我们所有人的事情!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM