Я использую этот рекурсивный код для чтения всех каталогов внутри другого каталога и сохраняю их в родительском каталоге.
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
возвращает .
запись, представляющая текущий каталог. Затем вы переходите к хранению этого каталога внутри своего родителя (самого себя). Таким образом, рекурсия.
Я предлагаю игнорировать .
и ..
Полученное сообщение «РЕКУРСИЯ» означает, что структура данных не может быть напечатана целиком, потому что она будет бесконечной.