Статическая переменная PHP работает не так, как ожидалось

#php #javascript

Вопрос:

Этот пример взят из php.net:

 <?php
function Test()
{
    static $a = 0;
    echo $a;
    $a  ;
}
?>
 

И это мой код:

 function getNextQuestionID()
{
    static $idx = 0;
    return $idx  ;
}
 

И я использую его в JavaScript:

 'quizID='   "<?php echo getNextQuestionID(); ?>"
 

Каждый раз возвращает 0. Почему?

Ответ №1:

Я полагаю, вы неправильно понимаете, что делают статические вары. Попробуйте этот код, и вы, возможно, поймете лучше:

 echo getNextQuestionID() . ", " getNextQuestionID() . ", " getNextQuestionID();
 

И вы поймете, что я имею в виду.

Статический var живет только до тех пор, пока работает сценарий.

Причина, по которой он возвращает 0 при первом запуске вместо 1, заключается в том, что вы используете постфиксный оператор $var вместо префиксной версии — $var. Разница в том, что приращение применяется только при использовании постфиксного оператора после возврата функции, но если вы используете префиксный оператор, он применяется до возврата функции.

Комментарии:

1. Извините, я имел в виду, что каждый раз возвращается 0. Я знаю разницу между пост-инкрементом и предварительным приращением.

Ответ №2:

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

Комментарии:

1. Даже использование $_SESSION в приведенном выше примере даст тот же результат, т. е. переменная сбрасывается в конце выполнения скрипта. Немного странно для переменной сеанса.

Ответ №3:

 session_start();
function getNextQuestionID()
{
    if (!isset($_SESSION['qNo'])) {
        $_SESSION['qNo'] = 0;
    } else {
        $_SESSION['qNo']  ;
    }

    return $_SESSION['qNo'];
}
 

Ответ №4:

 function getNextQuestionID()
{
    if (!isset($idx)) {
        static $idx = 0; // OR -1, if you want to start with 0 (ZERO);
    }
    $idx  ;
    return $idx;
}

echo getNextQuestionID().'<br />';
echo getNextQuestionID().'<br />';
echo getNextQuestionID().'<br />';
echo getNextQuestionID().'<br />';
 

возвращает 1,2,3,4

«статический» означает, что значение переменной сохраняется до тех пор, пока выполняется ваш скрипт (один вызов веб-сайта! чтобы сохранить его в течение нескольких звонков на веб-сайт, вам понадобятся СЕАНСЫ). Если функция вызывается более одного раза, значение сохраняется и не инициализируется повторно все время, и, следовательно, может увеличиваться.