PHP对象父/子递归

Dam*_*ien 6 php parent-child relationship

我有一个亲子OO关系.父对象具有许多子对象,并且每个子对象都通过引用知道它的父对象.

父母也可以是孩子(基本上是一棵树).

当我在根对象上执行var_dump()时,它会多次显示["parent"] => RECURSION,并且生成的描述将非常长.

我想知道我做错了什么.如果是的话,我对"最佳实践"感兴趣.

谢谢您的帮助!

tda*_*ers 12

你没有做错什么; 您有一个父项具有对其子项的引用,并且每个子项都有一个返回其父项的引用.当您var_dump()成为根对象时,它会遍历子对象以打印它们,并且由于每个子对象都有对父对象的引用,因此它会向后移动.因为这通常会导致无限循环(parent - > child - > parent - > child - > ...),PHP会保留已经访问过的对象列表,当遇到它时,它不会尝试转储它再次打印"RECURSION".

唯一需要注意的是PHP使用引用计数来进行垃圾收集,而像这样的循环结构本身并不能解决.因此,您的脚本将泄漏内存,这可能是也可能不是问题.要解决此问题,您需要手动清理:在父对象超出范围之前,您需要将所有父指针设置为null.

另见:http://bugs.php.net/bug.php?id = 33595

  • 从 PHP 5.3 开始,内存泄漏似乎已得到修复:(请参阅最后 2 条评论:https://bugs.php.net/bug.php?id=33595) (2认同)

Gor*_*don 7

var_dump函数以递归方式遍历对象图并打印对象的所有可访问数据.现在尝试将下图放入简单的英语中.

        has                var_dump:
Parent ----> Child         "The Parent object has a child object"
^              |               "That Child object has a Parent Object"
|______________| has               "That Parent object …"
Run Code Online (Sandbox Code Playgroud)

如果PHP不够智能来检测这种递归,它将无限运行.所以相反,它识别它已经转储了该对象并转储RECURSION.你没有做错任何事.

点击此处获取其他解释