关键字extends的PHP手册说:
必须在使用它们之前定义类!
此代码执行时没有错误:
class A extends B {}
class B {}
new A();
但是这段代码会返回一个致命的错误 - Class'B'找不到...
class A extends B {}
class B extends A {}
new A();
我假设一个相互扩展(第二个片段)会通过尝试创建A,然后是B,然后是A等来进行递归。
但是,显然,当它试图创建B类时,它意识到A不能被扩展。
有谁知道这种行为的根本原因? PHP是否记录了它试图创建的类,并且知道不再尝试?
更新
虽然这个片段有效:
class A extends B {}
class B {}
new A();
这个没有:
class A extends B {}
class B extends C {}
class C {}
new A();
所以,似乎@Mike指出,你必须在扩展它之前声明父类。 (虽然PHP在单个子类的情况下显然是宽容的。)这就是为什么相互递归会导致致命的 Class'B'未找到错误。
答案 0 :(得分:1)
基本上是的,具有某个名称(忽略名称空间)的类只能在脚本执行期间定义一次。您实际上是在尝试多次(无限次)定义类。
你有没有理由想这样做?这对我来说似乎很不合逻辑。除非你打算编写构造函数来阻止它,否则我只能看到你试图进行无限循环扩展......重点是什么?好奇心?你不记得那只猫发生了什么事吗?
编辑:引用PHP手册,“必须在使用类之前定义类!如果您希望类Named_Cart扩展类Cart,则必须首先定义类Cart。 ..定义类的顺序很重要。“没有找到B类,因为它在被指定为父类或A之前尚未被声明。反转你的定义的顺序并且你在同一条船上,因为它是递归的。
答案 1 :(得分:0)
第二个代码段始终会查找class A
的定义,而不是class B
的定义。
这是php在运行时可能会看到第二个片段的方式:
class A extends B {}
class B extends A {}
new A();
实际上,PHP没有找到B类的定义,因为它最终会查找A类的定义。
答案 2 :(得分:0)
请看看你的php版本,它也很重要。我已经用php 5.3.8测试了它,它可以工作。