#php #recursion #visual-studio-code #xdebug
#php #рекурсия #visual-studio-code #xdebug
Вопрос:
Я использую VSCode PHP Xdebug. Написал рекурсивную функцию, пытаюсь ее отладить. Но когда отладчик достигает конца стека «return true«, он не возвращается обратно в стек, он просто завершает работу. Я думал, что рекурсия, вероятно, была плохой. Я попробовал это на простейшем примере, но все равно то же самое.
Например:
function pow1($x, $n)
{
if ($n == 1) {
return $x;
} else {
return $x * pow1($x, $n - 1);
}
}
$result = pow1(2, 3);
echo $result;
Отладчик достигает return $x; и завершает работу со стеком с правильным результатом.
pow1 (d:OpenServerOSPaneldomainslocalhostindex.php:6)
pow1 (d:OpenServerOSPaneldomainslocalhostindex.php:8)
pow1 (d:OpenServerOSPaneldomainslocalhostindex.php:8)
{main} (d:OpenServerOSPaneldomainslocalhostindex.php:12)
И переходим сюда:
{main} (d:OpenServerOSPaneldomainslocalhostindex.php:14)
Я облазил все настройки Xdebug, пробовал разные варианты, ни один из них не помог. Переписал функцию на JavaScript и отладил в браузере.
Комментарии:
1. Где находятся ваши точки останова? Я использую PhpStorm, и после достижения
return $x;
строки (после ее выполнения) элемент управления возвращается тудаecho $resu<
, где у меня также была точка останова. Вот screenshot:postimg.cc/v4nLGTyf Вы должны понимать, что PHP может генерировать байт-код иначе, чем JavaScript, и работа отладчика может отличаться и от других языков. Здесь, в вашем коде, у вас есть только операторы «return». AFAIK Xdebug не останавливается}
перед выходом из функции.3. Ну .. на моем скриншоте показано, где находятся мои точки останова (строки # 4 и # 13) .. и он останавливается на них. После перехода
return $x;
отладчик останавливается наecho $resu<
линии (где находится 2-я точка останова). Это правильное поведение: все ваши операторы в этой функции являются просто возвратами. Для этого используется PhpStorm 2020.2.4 / 2020.3, PHP 7.4.13 x64 NTS в Windows 10, Xdebug 3.0.14. Я использовал разные языки программирования и, соответственно, IDE. Везде поведение одинаковое, я столкнулся с этим впервые. Возможно, я что-то ткнул в настройках самого php. Поэтому было бы интересно узнать мнение разработчиков, использующих VSCode. Кстати, сюда отправляются разработанные с GitHub.