На самом деле, если вы столкнулись с циклом, вы больше не можете разрешить.Пример:
1: {{2}}
2: {{1}}
Это создаст бесконечный цикл:
1 -> 2 -> 1 -> 2 -> ...
Поскольку ресурсы любого компьютера ограничены, бесконечные циклы приведут к сбою.
Так чтоты можешь сделать?Вы можете обнаружить это, а затем выдать ошибку с помощью стека:
function readData($wikipage)
{
static $stack = array();
if (in_array($wikipage, $stack))
{
throw new Exception(sprintf('Circular reference detected: %s -> %s', implode(' -> ', $stack), $wikipage));
}
$stack[] = $wikipage;
... (your existing code)
array_pop($stack);
}
Кроме того, вы можете контролировать предел рекурсии, используя count($stack)
для определения уровня вложенности.
На самом деле может вызвать исключениеНе будет правильной реакции на циклический эталон, но он показывает, как работает детекция.Вы можете сами решить, как бы вы хотели поступить с делом, например, вернуть FALSE
или больше не разрешать поле и т. Д.
Редактировать: Проявите творческий подход здесь:
Если вывод HTML, вы также можете разрешить пользователю проблему.Если такая циклическая ссылка обнаружена, может быть вставлен некоторый маркер AJAX, который запрашивает в браузере наложение в той или иной форме тот фрагмент кода, который не удалось получить на стороне сервера.Такое наложение затем будет снова содержать циклическую ссылку (возможность повторного наложения), чтобы пользователь мог видеть циклическую ссылку в интерактивном режиме.