开发者

What does " *RECURSION* " in print_r output mean?

I'm using this recursive code to read all directories inside another directory, and store them within the parent directory.

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

        foreach ($items as $itemName)
        {
            if (Dir::isIgno开发者_JS百科rable($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);
        }
    }

After this is done, if I do a print_r() on the global Object which is storing everything else, for some of the items it says:

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

What does that mean? Will I be able to access the parent object or not?


It means that the property is a reference to an object that has already been visited by print_r. print_r detects this and doesn't continue down that path; otherwise, the resulting output would be infinitely long.

In the context of your program, as scandir also returns references to the current and parent directories (named . and .., respectively), following them would lead to recursion. Following symbolic links may also cause recursion.


scandir returns the . entry, which represents the current directory. You then go to store this directory inside its parent (itself). Thus, recursion.

I suggest ignoring . and ...

The "RECURSION" message you got means the data structure cannot be printed in its entirety because it would be infinite.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜