2016-06-06 8 views
2

Так что я столкнулся с проблемой, которую я понял, как исправить, но мне очень любопытно, почему. Так вот блок кодаРекурсия бесконечного цикла?

<?php 

function test($attempt=1){ 
    if ($attempt == 5){ 
     echo "Done!";  
    }else{ 
     echo 'recursion!'; 
     test($attempt++); 
    } 

} 
$test = test(); 

Теперь этот код должен запустить первый раз, проверьте, перейдите в отчет еще затем запустить тест еще раз, но на этот раз с $ попытки ++, пока в конце концов не будет == до 5 и затем он будет повторяться и завершаться. Однако это не сработает, и он навсегда зацикливается. Однако она может быть исправлена ​​путем присвоения переменной в другой переменной сразу же после входа в функцию, как так

<?php 

function test($attempt=1){ 
    $nextAttempt = $attempt+1; 
    if ($attempt == 5){ 
     echo "Done!";  
    }else{ 
     echo 'recursion!'; 
     test($nextAttempt); 
    } 

} 
$test = test(); 

Любые идеи, почему это?

+0

Кроме того, вы понимаете, что установка '$ тест = тест()' ничего не делает, так как 'тест()' не возвращают ценность, правильно? –

ответ

4

Вы хотите Преинкремент вместо пост-приращение переменной. Это увеличит переменную $attempt перед передачей ее в качестве аргумента функции вместо после.

Итак, в основном вы хотите test(++$attempt); вместо test($attempt++);.

Песочница с рабочим например: http://sandbox.onlinephpfunctions.com/code/c50731815588d55bd079e701f1c5dde9e7148696

+1

Сегодня я узнал. – CMOS

+0

Принял меня несколько минут, чтобы увидеть это сам, это не слишком очевидно ;-) Рад помочь! – Qirel

+1

Вы можете легко поймать такие проблемы, если у вас есть правильная настройка отладки (например, xdebug) для перехода по вашему коду. – georaldc

1

Оператор ++ выполняется после оценки предложения, поэтому вы выполняете вызов функции с тем же значением за все время.

test($attempt++); 

является тем же, чем:

test($attempt); 
$attempt = $attempt + 1 
Смежные вопросы