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

net*_*der 6 php inheritance interface

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

以下代码不起作用:

interface A {}
class C extends B {} // Class 'B' not found
class B implements A {}
Run Code Online (Sandbox Code Playgroud)

这解决了它:

interface A {}
class B implements A {}
class C extends B {} // Class 'B' is found
Run Code Online (Sandbox Code Playgroud)

但这很好用:

class A {}
class C extends B {} // Class 'B' is found
class B extends A {}
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!

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

Fil*_*efp 8

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

对象继承(注):

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

 

PHP:扩展 - 手册(注)

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


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

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

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

你可能会把它称为bug,但在C++中我们会把它描述为undefined behaviorie.不应该依赖的东西.


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

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