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