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