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

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

сообщение "рекурсия", которое вы получили, означает, что структура данных не может быть напечатана полностью, потому что она будет бесконечной.