PHP оценивает переменные, когда функция определена? - PullRequest
1 голос
/ 04 февраля 2009

Я создаю многостраничную форму в PHP, используя сеанс. Переменная $stage отслеживает прогресс пользователя при заполнении формы, (ОБНОВЛЕНИЕ) и обычно устанавливается в $ _POST на каждом этапе формы.

На второй странице (этап 2) кнопка отправки формы получает свое значение следующим образом:

echo '<input type="hidden" name="stage" value="';
echo $stage + 1;
echo '" />;

Это прекрасно работает - $stage + 1 оценивает до 3, если я на странице 2. Но так как я делаю это более одного раза, я решил вытащить этот код в функцию, которую я определил в верхней части мой код, до $stage упоминается.

В том же месте, где я ранее использовал приведенный выше код, я вызываю функцию. Я проверил, что код функции такой же, но теперь $stage + 1 оценивается как 1.

Оценивает ли PHP мою переменную при определении функции, а не при ее вызове? Если так, как я могу предотвратить это?

Обновление 1

Чтобы проверить эту теорию, я установил $stage = 2 до определения своей функции, но она все равно оценивается в 1, когда я вызываю функцию. Что происходит?

Проблема решена

Спасибо всем, кто предложил переменную область видимости в качестве виновника - сейчас я бью себя по лбу. $stage была глобальной переменной, и я не называл ее $GLOBAL_stage, как обычно, чтобы предотвратить подобные проблемы.

Я добавил global $stage; в определение функции, и она отлично работает. Спасибо!

Ответы [ 5 ]

6 голосов
/ 04 февраля 2009

Нет, PHP будет оценивать вашу переменную при вызове функции. Но у вашей функции есть локальная область видимости переменной , то есть, не видя вашей функции, я бы предположил, что вы работаете с локальной переменной. Вы можете импортировать глобальные переменные в вашу функцию, хотя это не рекомендуется:

function myfunction() {
    global $stage;
    ...
}

Трудно сказать без знания вашего кода, но я бы сказал, что вы используете 'register globals' для внедрения параметров вашей формы в глобальные переменные PHP ( этот случай). Возможно, вы захотите отключить register_globals, потому что это действительно риск для безопасности, и вместо этого использовать так называемые суперглобальные переменные.


редактировать

Хорошо, вы видите свою стадию в массиве $ _POST. Все еще дико догадываясь о вашей функции, вы можете попробовать следующее:

function my_insert_stage_param() {
    global $stage;
    echo '<input type="hidden" name="stage" value="';
    echo $_POST['stage'] + 1;
    echo '" />';
}

Suberglobals, такие как массив $ _POST, не нужно объявлять с global.

2 голосов
/ 04 февраля 2009

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

Чтобы отладить сеанс, поместите print_r ($ _ SESSION); умереть; вверху каждой страницы.

1 голос
/ 20 марта 2009

Вы действительно должны передать значение рабочей области в качестве параметра функции, а не полагаться на глобальный или суперглобальный ($ _POST).

function formNextStage($stage) {
    return formHidden('stage', $stage + 1);
}

function formHidden($name, $value = '') {
    return sprintf('<input type="hidden" name="%s" value="%s" />', $name, $value);
}
echo formNextStage($stage);

Я рекомендую вам полностью сбросить функцию formStage и использовать formHidden, как

echo formHidden('stage', $stage + 1);

Вы можете использовать эту функцию, используя необязательные атрибуты в виде массива, экранируя имена / значения и т. Д. При необходимости.

function formHidden($name, $value = '', $attributes = array(), $escape = true)
1 голос
/ 04 февраля 2009

Звучит так, как будто вы столкнулись с проблемой прицела.

Попробуйте поставить:

global $stage;

Как первая строка в функции.

1 голос
/ 04 февраля 2009

Исходный код пригодится при отладке вашего кода.

Как $stage определяется или инициализируется? Функции имеют свою собственную переменную scope - то, что определено в функции, остается в функции. Если вы не определили переменную как глобальную в начале функции, то есть (global $foo;).

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