PHP类继承和递归

时间:2011-11-18 18:43:34

标签: php inheritance recursion

关键字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'未找到错误。

3 个答案:

答案 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();
  1. 定义A类但我需要在定义A类之前先找到B类的定义。
  2. 我找到了B类但我需要在定义B类之前先找到A类的定义。
  3. 重复1次。
  4. 实际上,PHP没有找到B类的定义,因为它最终会查找A类的定义。

答案 2 :(得分:0)

请看看你的php版本,它也很重要。我已经用php 5.3.8测试了它,它可以工作。