Рассмотрим приведенный ниже фрагмент кода, демонстрирующий рекурсию:
<?php
function test() {
static $count = 0;
$count++;
echo $count."<br>";
if($count < 10) {
test();
}
echo "Count Value : ".$count--;
}
test();
?>
Вывод вышеуказанного кода выглядит следующим образом:
1
2
3
4
5
6
7
8
9
10
Count Value : 10
Count Value : 9
Count Value : 8
Count Value : 7
Count Value : 6
Count Value : 5
Count Value : 4
Count Value : 3
Count Value : 2
Count Value : 1
Я ожидал, что последний код функции test()
то есть echo "Count Value : ".$count--;
выполнится только один раз, когда условие if возвращает false при $count = 10;
и все будет кончено.
Но неожиданно я выполняю его десять раз с уменьшением значения переменной $count
, Я не понимаю, как это происходит? Как здесь неожиданно манипулируют потоком кода?
Поскольку рекурсивный вызов функции выполняется внутри условия if, как он может быть вызван впоследствии для Еще 10 раз даже после невыполнения условия if?
Пожалуйста, объясните мне.
Примечание: я не забыл добавить еще и не хочу. Просто объясните, почему и как последний оператор выполняется только после печати nos. от 1 до 10 и только после невыполнения условия if. Когда условие if возвращало true, оно не выполнялось. Как?
Я думаю, что ты забыл остальное.
<?php
function test() {
static $count = 0;
$count++;
echo $count."<br>";
if($count < 10) {
test(); // when this call is made, all the code bellow waits for it to return
} else {
echo "Count Value : ".$count--;
}
}
test();
?>
Что происходит, так это то, что каждый раз, когда вы вызываете test (), внутри условия if выполнение останавливается до тех пор, пока не будет вызван вновь вызванный test (). Функция test () возвращается только тогда, когда $count >= 10
, Это означает, что вызов всех зависших функций будет продолжен. Что такое рекурсивная функция в PHP?
Ваш код может быть переведен на что-то вроде этого;
<?php
function test() {
static $count = 0;
$count++;
echo $count."<br>";
if($count < 10) {
static $count = 1;
$count++;
echo $count."<br>";
if($count < 10) {
static $count = 2;
$count++;
echo $count."<br>";
if($count < 10) {// ... the code repeats until the point when $count = 9
} else {
echo "Count Value : ".$count--;
}
} else {
echo "Count Value : ".$count--;
}} else {
echo "Count Value : ".$count--;
}
}
test();
?>
Ваш код выполняется 9 раз по сравнению с рекурсией + 1 извне, так что должно быть нормально иметь всего 10 выполнений.
Вот комментируемая версия:
<?php
function test() {
static $count = 0; // initialize only the first run
$count++;
echo $count."<br>"; // Current $count status
if($count < 10) { // goes on until 9
test(); // This function will run before everything else
}
// regardless the value of $count print $count then decreases it
echo "Count Value : ".$count--;
//only the other calls in the stack will see by the -- operator effect
}
test();
?>