Как очистить статическую переменную в PHP после завершения рекурсии? - PullRequest
9 голосов
/ 28 апреля 2011

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

Например, у нас есть функция:

<?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);
}
?>

Мы можем вызвать функцию в первый раз, как это: someFunction();и это будет работать нормально.Затем мы вызываем его снова: someFunction();, но на этот раз он начинается с предыдущего значения для $variable.Как мы можем сбросить его после рекурсии первого раза, когда мы вызвали функцию, чтобы во второй раз, когда мы ее вызвали, это было похоже на начало заново?

Ответы [ 6 ]

8 голосов
/ 28 апреля 2011

Самое простое, что нужно сделать - передать переменную в качестве аргумента. Я бы не стал связываться со статикой здесь.

function someFunction($value = null) {
    do stuff; change value of $value; do stuff;
    someFunction($value); # The value of $variable persists through the recursion.
    return $value;
}

Как правило, вы должны передавать аргументы функции (если они не работают со свойствами класса в одном и том же классе) ... они не должны быть глобальными, а в случае рекурсии, вероятно, не очень хорошая идея сделать они статичны ... Обращайтесь с функцией как с черным ящиком ... значения вступают в силу ... они выполняют с ними /, и получается результат. Они не должны знать о вещах, происходящих в другом месте. Есть некоторые исключения, но по IMO их очень мало.

3 голосов
/ 28 ноября 2014

Ответ Prodigitalsons - лучшее решение, но поскольку вы попросили решение с использованием статических переменных, а я не вижу подходящего ответа, вот мое решение.

Просто установите статическую переменную на ноль, когда вы закончите.В следующих вызовах будет напечатано 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";

Или объедините это с предыдущим ответом с инициализатором:

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);

Будет выводиться:

345
45
12345
-1012345
3 голосов
/ 28 апреля 2011

Хорошо, хорошо, я вижу, как блудники меня обманывают в ответе.Вот демо:

http://codepad.org/4R0bZf1B

<?php
function someFunction($varset = NULL) {
    static $variable = NULL;
    if ($varset !== NULL) $variable = $varset;
    $variable++;
    echo $variable;
    if ($variable < 5) someFunction();
    return $variable;
}

someFunction(4);
echo "\n";
someFunction(2);
echo "\n";
someFunction(3);

?>

Выходы:

5
345
45
0 голосов
/ 26 июня 2018
<?php
function someFunction() {
    static $variable = null;
    do stuff; change value of $variable; do stuff;
    someFunction(); # The value of $variable persists through the recursion.
    $variable = null;
    return ($variable);
}
?>
0 голосов
/ 10 сентября 2016

Вы можете использовать $depth счетчик:

function someFunction() {
    static $variable = null, $depth= 0;
    $depth++;

    do stuff; change value of $variable; do stuff;
    someFunction(); # The value of $variable persists through the recursion.

    $depth--;
    $temp = $variable;
    if($depth== 0){
        $variable = null;
    }
    return ($temp);
}
0 голосов
/ 28 апреля 2011

Я нашел решение:

<?php
function someFunction($clear_static = false) {
    static $variable = null;
    if ($clear_static) {
        $variable = null;
    }
    do stuff; change value of $variable; do stuff;
    someFunction(); # The value of $variable persists through the recursion.
    return ($variable);
}

someFunction(); # first manual call.
someFunction(); # second manual call, $variable has value from previous use.
someFunction(true); # third manual call, value of $variable starts like new.
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...