print_r输出中的“* RECURSION *”是什么意思?

时间:2011-04-26 04:48:55

标签: php oop recursion

我正在使用这个递归代码来读取另一个目录中的所有目录,并将它们存储在父目录中。

protected function readDirs($parent)
    {       
        $currentDir = $parent->source();
        $items = scandir($currentDir);

        foreach ($items as $itemName)
        {
            if (Dir::isIgnorable($itemName) )
                continue;

            $itemPath = $currentDir.SLASH.$itemName;
            if (! is_dir($itemPath) )
                continue;

            $item = new ChangeItem(TYPE_DIR);            
            $item->parent($parent)->source($itemPath);

            $parent->children[ $itemName ] = $item;

            $this->readDirs($item);
        }
    }

完成此操作后,如果我在存储其他所有内容的全局对象上执行print_r(),则对于其中的某些项目:

[parent:protected] => ChangeItem Object
 *RECURSION*

这是什么意思?我能否访问父对象?

2 个答案:

答案 0 :(得分:17)

这意味着该属性是对print_r已访问过的对象的引用。 print_r检测到此情况并且不会沿着该路径继续;否则,结果输出将无限长。

在程序的上下文中,由于scandir还返回对当前目录和父目录(分别名为...)的引用,因此跟随它们将导致递归。以下符号链接也可能导致递归。

答案 1 :(得分:3)

scandir返回.条目,表示当前目录。然后,您将此目录存储在其父(自身)中。因此,递归。

我建议忽略...

您获得的“RECURSION”消息意味着数据结构无法完整打印,因为它将是无限的。