Повторная инициализация статических членов в PHP - PullRequest
3 голосов
/ 17 ноября 2011

У меня есть вопрос в моем сегодняшнем экзамене, в котором я должен определить выход.

<?php
function statfun($x)
{
    static $count=0;

    $count += $x;

    if ($count < 20) {
        echo "$count <br>";
        statfun(++$x);
    } else {
        echo "last num is $count";
    }
}

statfun(2);
?>

Выход -

2
5
9
14
last num is 20

Я не знаю, почему это выход.Я знаю, что это происходит из-за статического члена, но каждый раз, когда он входит в функцию, член $count повторно инициализируется. Я видел документацию по Статическое ключевое слово .

Но тамничего не написано относительно повторной инициализации статической переменной?Можем ли мы повторно инициализировать статическую переменную в PHP?С таким же или любым другим значением?

Ответы [ 2 ]

5 голосов
/ 17 ноября 2011

каждый раз, когда она входит в функцию, $ count повторной инициализации

Это неверно. Статические переменные инициализируются только один раз , поэтому статически объявленные переменные отличаются от "обычных" переменных. В общем, вы присваиваете начальное значение $count. При множественных вызовах statfun() значение этой статической переменной сохраняется и может использоваться повторно.

Из руководства , раздел «Использование статических переменных»:

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

Также посмотрите пример кода в руководстве. Указанная разница должна ответить на ваш вопрос.

3 голосов
/ 17 ноября 2011

когда вы передаете 2, счетчик устанавливается на 2 с помощью $count+=$x;, тогда вы вызываете statfun(++$x), что составляет $x+1, а это 2+1=3, так что теперь $ count будет $count+3, то есть 5, а затемВы вызываете statfun со значением 3, затем $ count будет $ count + (3 + 1) = 9 и т. д. и т. п.

Статическая переменная будет сохранять свое состояние.Таким образом, если вы называете это так

Таким образом, в основном статическая переменная будет хранить свое значение и не будет повторно инициализирована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...