Этот пример взят с php.net:
<?php
function Test()
{
static $a = 0;
echo $a;
$a++;
}
?>
И это мой код:
function getNextQuestionID()
{
static $idx = 0;
return $idx++;
}
И я использую это в JavaScript:
'quizID=' + "<?php echo getNextQuestionID(); ?>"
Каждый раз возвращает 0. Почему?






Я считаю, что вы неправильно понимаете, что делают статические вары. Попробуйте этот код, и вы сможете лучше понять:
echo getNextQuestionID() . ", " getNextQuestionID() . ", " getNextQuestionID();
И вы поймете, что я имею в виду.
Статическая переменная живет только до тех пор, пока живет скрипт.
Причина, по которой он возвращает 0 при первом запуске вместо 1, заключается в том, что вы используете постфиксный оператор $ var ++ вместо версии с префиксом - ++ $ var. Разница в том, что приращение применяется только при использовании постфиксного оператора после возврата из функции, но если вы используете префиксный оператор, оно применяется до возврата из функции.
Если вы хотите, чтобы ваши данные сохранялись на нескольких страницах, вам нужно использовать сессии.
Даже использование $ _SESSION в приведенном выше примере даст тот же результат, т.е. переменная будет сброшена в конце выполнения скрипта. Довольно странно для переменной сеанса.
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
«статический» означает, что значение переменной сохраняется, пока работает ваш скрипт (один вызов веб-сайта! чтобы сохранить его после нескольких вызовов веб-сайта, вам потребуются СЕССИИ). Если функция вызывается более одного раза, значение сохраняется и не переинициализируется все время, и, следовательно, его можно увеличивать.
Извините, я имел в виду, что каждый раз возвращает 0. Я знаю разницу между постом и предварительным приращением.