我今天偶然发现了一个有趣的问题。在单个文件中有多个声明的上下文中,如果B
类实现了A
接口(interface),并且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 {}
这些是我在带有suhosin的PHP 5.3.8(Win32)和PHP 5.3.3-1ubuntu9.6上获得的结果。
所以问题是,是记录在案的行为吗? 为什么它可以与类一起使用但不能与接口(interface)一起使用?还是应该将其视为错误?
在我深入研究PHP的源代码和/或打开PHP错误凭单之前,请让我了解您的经验。 :)
谢谢!
注意:我知道这只是类声明顺序的问题,但这使我感到困惑……如果不合适,请不要犹豫。
最佳答案
是的,这是记录的行为:
未定义的行为(带有讽刺意味)
即使您的第三个示例可以说出来,也不能说根据文档说明它是可行的(而且我找不到任何更改日志条目,说明该功能已引入)。
可悲的是,PHP的文档并不是100%,但是您只能相信自己所知道的,上面的引言是我能找到的有关此问题的全部信息。
您可能将其称为错误,但是在C++中,我们将其描述为undefined behavior
即。不应该依赖的东西。
如果“标准”(文档)未提及,则使用不安全。
如果“标准”(文档)没有提及它,则可能会使宇宙内爆-或猛禽跳过您的 window 。 不要做任何可以杀死我们所有人的事情!