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.
精彩评论