Что означает "* рекурсия* " в выводе 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*
что это значит? Смогу ли я получить доступ к родительскому объекту или нет?
2 ответов
это означает, что свойство является ссылкой на объект, который уже был посещен print_r
. print_r
обнаруживает это и не продолжает этот путь; в противном случае результирующий вывод будет бесконечно длинным.
в контексте вашей программы, как scandir
также возвращает ссылки на текущий и родительский каталоги (по имени .
и ..
, соответственно), следование за ними приведет к рекурсии. Следующие символические ссылки также могут вызвать рекурсию.
scandir
возвращает .
запись, представляющая текущий каталог. Затем вы идете, чтобы сохранить этот каталог внутри своего родителя (себя). Таким образом, рекурсия.
Я предлагаю игнорировать .
и ..
.
сообщение "рекурсия", которое вы получили, означает, что структура данных не может быть напечатана полностью, потому что она будет бесконечной.