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