Что означает значение «* RECURSION *» в print_r?

Я использую этот рекурсивный код для чтения всех каталогов внутри другого каталога и сохраняю их в родительском каталоге.

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* 

Что это значит? Смогу ли я получить доступ к родительскому объекту или нет?

Это означает, что свойство является ссылкой на объект, который уже был посещен print_r . print_r обнаруживает это и не продолжает этот путь; в противном случае полученный результат будет бесконечно длинным.

В контексте вашей программы, поскольку scandir также возвращает ссылки на текущие и родительские каталоги (named . И .. , соответственно), последующие за ними приводят к рекурсии. Следующие символические ссылки также могут вызывать рекурсию.

scandir возвращает . запись, представляющая текущий каталог. Затем вы переходите к хранению этого каталога внутри своего родителя (самого себя). Таким образом, рекурсия.

Я предлагаю игнорировать . и ..

Полученное сообщение «РЕКУРСИЯ» означает, что структура данных не может быть напечатана целиком, потому что она будет бесконечной.