tru*_*ktr 10 php recursion static-variables
所以例如,我在递归函数中有一个静态变量,我希望该变量在每次递归调用时都是静态的,但是一旦递归完成,我希望该变量被重置,以便下次我使用它从头开始的递归函数.
例如,我们有一个功能:
<?php
function someFunction() {
static $variable = null;
do stuff; change value of $variable; do stuff;
someFunction(); # The value of $variable persists through the recursion.
return ($variable);
}
?>
Run Code Online (Sandbox Code Playgroud)
我们可以这样第一次调用这个函数:someFunction();它会正常工作.然后我们再次调用它:someFunction();但这次它以前一个值开始$variable.我们怎样才能在第一次调用函数的递归后重置它,这样我们第二次调用它就像重新开始一样?
最简单的方法是将变量作为参数传递.我不会在这里搞乱静态.
function someFunction($value = null) {
do stuff; change value of $value; do stuff;
someFunction($value); # The value of $variable persists through the recursion.
return $value;
}
Run Code Online (Sandbox Code Playgroud)
作为一般规则,您必须将参数传递给函数(除非它们对同一类中的类属性进行操作)......它们不应该是全局的,并且在递归的情况下,将它们设置为静态可能不是一个好主意.对待一个像黑盒子一样的功能...值进去......他们用它们完成了一些事情并且结果出来了.他们不应该意识到其他地方发生的事情.有一些例外,但IMO很少.
Prodigitalsons的答案是最好的解决方案,但是由于您要求使用静态变量的解决方案,因此我找不到合适的答案,这是我的解决方案。
完成后,只需将static变量设置为null即可。以下将在两个呼叫上打印12345。
function someFunction() {
static $variable = 0;
$variable++;
echo $variable;
if ($variable < 5) someFunction();
$returnValue = $variable;
$variable = null;
return $returnValue;
}
someFunction();
echo "\n";
someFunction();
echo "\n";
Run Code Online (Sandbox Code Playgroud)
或者将其与上一个答案与初始化程序结合使用:
function someFunction($initValue = 0) {
static $variable = 0;
if($initValue !== 0) {
$variable = $initValue;
}
$variable++;
echo $variable;
if ($variable < 5) someFunction();
$returnValue = $variable;
$variable = null;
return $returnValue;
}
someFunction(2);
echo "\n";
someFunction(3);
echo "\n";
someFunction();
echo "\n";
someFunction(-2);
Run Code Online (Sandbox Code Playgroud)
将输出:
345
45
12345
-1012345
Run Code Online (Sandbox Code Playgroud)