Заранее извиняюсь (новичок здесь), но пытаюсь понять и с трудом нахожу тему, непосредственно связанную с этим. Я сделал вариацию из примера №6 Статические переменные с рекурсивными функциями из руководства по PHP
http://php.net/manual/en/language.variables.scope.php
<?php
function test() {
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
echo $count;
}
test();
?>
Выход 123456789109876543210
Я ожидал бы, что он остановится после того, как перейдет к 9 за пределами оператора if и будет уменьшен.
(Например) 123456789109
Я явно не понимаю статическую область видимости и поток кода. Я действительно должен выяснить отладчик, идущий вперед, но какие-нибудь указатели?
Может быть, эта маленькая модификация поможет вам лучше понять.
Почему он не останавливается после перехода к 9 за пределами оператора if?
Потому что каждый вызов теста запускает тест до конца. Это было увеличено в 10 раз, и это было уменьшено в 10 раз. Сначала увеличиваем его в 10 раз из-за 10 вызовов теста, а в 10-м вызове начинается замедление. 10-й звонок завершен, а 9-й звонок уменьшен. Девятый звонок закончен, а восьмой звонок уменьшен ….
<?php
function test()
{
static $count = 0;
$count++;
echo $count.". call of test() (output after incrementing)<br />";
if ($count < 10) {
test();
}
echo $count.". call of test() (output before decrementing)<br />";
$count--;
}
test();
?>
Выход:
1. call of test() (output after incrementing)
2. call of test() (output after incrementing)
3. call of test() (output after incrementing)
4. call of test() (output after incrementing)
5. call of test() (output after incrementing)
6. call of test() (output after incrementing)
7. call of test() (output after incrementing)
8. call of test() (output after incrementing)
9. call of test() (output after incrementing)
10. call of test() (output after incrementing)
10. call of test() (output before decrementing)
9. call of test() (output before decrementing)
8. call of test() (output before decrementing)
7. call of test() (output before decrementing)
6. call of test() (output before decrementing)
5. call of test() (output before decrementing)
4. call of test() (output before decrementing)
3. call of test() (output before decrementing)
2. call of test() (output before decrementing)
1. call of test() (output before decrementing)
Других решений пока нет …