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

时间:2011-12-19 16:03:43

标签: php inheritance interface

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

以下代码不起作用:

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错误票之前,请告诉我您的体验。 :)

谢谢!

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

1 个答案:

答案 0 :(得分:8)

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

  

Object Inheritance (Note)

     

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

  

PHP: extends - Manual (Note)

     

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


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

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

PHP的文档遗憾地不是100%,但你只能相信你所知道的,而且上面的引用都是我能找到的关于这个问题的。

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


如果“标准”(文档)没有提到它,则使用它是不安全的。

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