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

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

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

И это мой код:

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

И я использую это в JavaScript:

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
1 883
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

Статическая переменная живет только до тех пор, пока живет скрипт.

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

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

syaz 13.10.2008 13:45

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

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

syaz 13.10.2008 16:27

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

    return $_SESSION['qNo'];
}

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

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

Другие вопросы по теме