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错误票之前,请告诉我您的体验。 :)
谢谢!
注意:我知道这只是课堂申报顺序的问题,但这让我很困惑......如果不合适,请不要犹豫,关闭。
答案 0 :(得分:8)
是的,这是记录在案的行为:
除非使用自动加载,否则必须在使用之前定义类。 如果一个类扩展另一个类,则必须在子类结构之前声明父类。此规则适用于继承其他类和接口的类。
必须在使用类之前定义类!如果您希望Named_Cart类扩展Cart类,则必须首先定义类Cart。如果要基于Named_Cart类创建另一个名为Yellow_named_cart的类,则必须首先定义Named_Cart。简而言之:定义类的顺序很重要。
即使您的第三个示例可能会说出来,但根据文档说它并不起作用(我找不到任何更改日志条目,说明它是引入的功能)。
PHP的文档遗憾地不是100%,但你只能相信你所知道的,而且上面的引用都是我能找到的关于这个问题的。
你可能称之为bug,但在C ++中我们会将其描述为undefined behavior
即。不应该依赖的东西。
如果“标准”(文档)没有提到它,则使用它是不安全的。
如果“标准”(文档)没有提到它,它可能会使宇宙内爆 - 或猛禽跳过你的窗户。 不要做任何可以杀死我们所有人的事情!