Ошибка использования $ _SERVER в переменной переменной (PHP) - PullRequest
3 голосов
/ 08 марта 2011

Я пытался получить имя суперглобальной переменной через параметр GET.Мне сказали передать только _VAR_NAME (без $) в запросе get, поэтому в программе я должен получить к нему доступ через переменную переменную: $$_GET['parameter_name'].

Все прошло нормально, кроме$_SERVER.Чтобы попробовать что-то не так, я просто сделал небольшой скрипт php, чтобы проверить, что происходит.Вот код:

<?php
    // ¡¡ This does not work !!
        $nombre = "_SERVER";
        $var = $$nombre;
        print_r($var);
    // This works 
        $nombre = "_GET";
        $var = $$nombre;
        print_r($var);
?>

Есть ли причина, по которой версия _SERVER не работает?Я получаю следующую ошибку:

Примечание: неопределенная переменная: _SERVER in ...

Ответы [ 4 ]

2 голосов
/ 08 марта 2011

Я не уверен, зачем вам это нужно, я не использую переменные переменные (обычно есть лучшие способы).

Вы можете сделать простое переключение на основе вашей переменной $ nombre, суперглобальных переменных не так много!

switch ($nombre) {
  case "_SERVER" : 
    print_r($_SERVER);
    break;
  case "_GET" : 
    print_r($_GET);
    break;
  case "_POST" : 
    print_r($_POST);
    break;
  // ...
  default:
    echo "Unknown variable";
}
1 голос
/ 08 марта 2011

Вы можете попробовать альтернативный синтаксис:

$var = $GLOBALS["_SERVER"];
print_r($var);

Это функционально эквивалентно $$varvar.

Еще одна важная вещь, которую необходимо проверить, - это наличие $_SERVER. (Если нет, поместите пустое выражение count($_SERVER); в начале вашего скрипта.)

Может отсутствовать, если variables_order= был изменен в php.ini (хотя в последних версиях PHP он должен отображаться как пустой массив).

0 голосов
/ 02 ноября 2016

Когда директива auto_globals_jit включена, переменные SERVER и ENV создаются при их первом использовании ( Just In Time ) вместо запуска сценария. PHP Manual предупреждает о переменных переменных:

Использование переменных SERVER и ENV проверяется во время компиляции, поэтому их использование, например, переменных переменных не приведет к их инициализации .

Возможные решения:

  • Использование функции PHP getenv() вместо переменной SERVER.
  • Добавление только строки $_SERVER; до или в начале скрипта.
  • Отключена директива (в php.ini : auto_globals_jit = Off или внутри скрипта: ini_set('auto_globals_jit',0);)
  • Использование ключа '_SERVER' в массиве $ GLOBALS ($GLOBALS['_SERVER'])
0 голосов
/ 08 марта 2011

Это прекрасно работает здесь для меня.если бы вы пробовали print_r ($ _SERVER)

, возможно, он не заполняется в вашей системе.

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


Используете ли вы его в функции или классе?

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

Лучше всего ставить оператор switch.

...