Ответ
Да, формально такой код написать можно, но его выполнение почти мгновенно завершится ошибкой переполнения стека вызовов (Stack Overflow).
Пример проблемного кода:
function infiniteRecursion() {
infiniteRecursion(); // Каждый вызов добавляет новый фрейм в стек
}
infiniteRecursion();
Что происходит:
- Каждый вызов функции помещает в стек вызовов информацию о локальных переменных, аргументах и точке возврата.
- При бесконечной рекурсии этот стек исчерпывает выделенную ему память.
- Интерпретатор PHP аварийно завершает скрипт.
Ограничения в PHP:
- При активном расширении Xdebug сработает ограничение
xdebug.max_nesting_level(по умолчанию 256). - Без Xdebug скрипт упадет при достижении лимита стека, установленного самим PHP или операционной системой.
Правильная альтернатива: Для задач, требующих повторения, следует использовать итеративные циклы.
// Вместо рекурсии — цикл
while (true) {
// ... логика ...
if ($exitCondition) {
break; // Контролируемый выход
}
}
Рекурсию стоит применять только для задач, которые по своей природе рекурсивны (обход деревьев, факториал), и всегда предусматривать базовый случай (base case) для остановки.
Ответ 18+ 🔞
Вот, смотри, с технической точки зрения такой код скомпилируется и даже запустится, но через долю секунды он накроется медным тазом с ошибкой переполнения стека (Stack Overflow). Пиздец, а не результат.
Самый простой пример говнокода:
function infiniteRecursion() {
infiniteRecursion(); // Каждый чих этой функции кладёт новый кирпич в стек
}
infiniteRecursion();
Что там внутри происходит, ёпта:
- Каждый раз, когда функция зовёт саму себя, система судорожно пихает в специальную память (стек) данные: что куда вернуть, что с чем сравнивать. Представь, что ты пытаешься засунуть диван в шкаф, а потом ещё один такой же диван в тот, который уже засунул.
- При такой бесконечной рекурсии эта память заканчивается мгновенно. Овердохуища фреймов, а места — ноль.
- PHP, видя этот пиздец, просто убивает скрипт нахуй. Всё, приехали.
На что можно упереться в PHP:
- Если стоит Xdebug, он первый заорует: «Стой, блядь!» — и выкинет ошибку, потому что есть лимит на вложенность вызовов (
xdebug.max_nesting_level). Обычно это что-то около 256 раз. - Без Xdebug скрипт будет тупо долбить стек, пока операционка или сам PHP не скажут «всё, хуйня, заканчиваем».
Как делать надо, чтобы не было мучительно больно: Для задач, где нужно что-то делать много раз подряд, используй нормальные циклы. Рекурсия — это как острый нож, хороший инструмент, но если им пытаться колоть дрова, останешься без пальцев.
// Вместо рекурсии — простой и понятный цикл
while (true) {
// ... делаем дела ...
if ($exitCondition) {
break; // Выходим красиво и по-взрослому
}
}
Рекурсию оставь для особых случаев, где она реально уместна: обход папок как дерева, вычисление факториала. И главное правило — всегда делай условие выхода (base case), иначе получишь ту самую хиросиму в стеке.