Подтвердить что ты не робот

Что означает значение "* 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*

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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