$ _REQUEST superarray не инициализирован в массиве $ GLOBALS - PullRequest
1 голос
/ 22 декабря 2011

ПРОБЛЕМА

Итак, у меня есть эта функция для извлечения и обработки данных из массивов $ _REQUEST, $ _POST, $ _GET или $ _COOKIE. Я знаю, какой массив использовать только из вызова функции. Упрощенный пример:

function gg( $name, $type="_REQUEST" ) {
    return isset( $GLOBALS[$type][$name] ) ? $GLOBALS[$type][$name] : false;
}

И он прекрасно работает для звонков, таких как:

gg('var', '_GET');
gg('var2', '_POST');

Но резко не работает для:

gg('var');
// or
gg('var', '_REQUEST');

Мне удалось упростить эту проблему до 2 строк:

print_r( $GLOBALS['_REQUEST'] ); // this line returns nothing...
print_r( $_REQUEST ); // ...UNLESS this line is present anywhere in the code

Теперь мой очевидный вопрос: есть ли необходимость инициализировать этот массив $ _REQUEST, чтобы он присутствовал в $ GLOBALS?

дополнительная информация:

php: 5.3.3-7
apache: 2.2.16

also I'm running on CGI/FastCGI

РЕДАКТИРОВАТЬ И РЕШЕНИЕ

1

Как найдено здесь , самое простое решение - отредактировать php.ini и изменить значение auto_globals_jit с On на Off.

auto_globals_jit Off

2

Вместо этого вы можете использовать ini_set () внутри вашего исходного файла, однако у меня это не сработало ...

ini_set("auto_globals_jit", "Off");

3

Еще одно решение - использовать массив $ GLOBALS для всего, кроме $ _ REQUEST , а для запросов $ _REQUEST вызывать напрямую массив $ _REQUEST: D

if($type == "REQUEST") return $_REQUEST[$name];
else return ${"_".$type}[$name]; // or $GLOBALS["_".$type][$name] if previous won't work

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

Просто совет:

function gg( $name, $type="_REQUEST" ) {
  if($type=="_REQUEST")return $GLOBALS[$name];
  return isset( $GLOBALS[$type][$name] ) ? $GLOBALS[$type][$name] : false;
}

Как только я сделал такую ​​функцию, как ваша:

    function get_data($name)
    {
        if(isset($_GET[$name]))return $_GET[$name];
        if(isset($_POST[$name]))return $_POST[$name];
    }
1 голос
/ 22 декабря 2011

Не удалось воспроизвести это на моей установке, так что это может быть проблемой CGI? В качестве обходного пути вы могли бы сделать что-то вроде этого ...

function gg( $name, $type="_REQUEST" ) {
    return isset( ${$type}[$name] ) ? ${$type}[$name] : false;
}

Может представлять интерес:

Начиная с PHP 5.4, $ GLOBALS теперь инициализируется точно в срок. Это означает теперь есть преимущество не использовать переменную $ GLOBALS, как вы можете избежать накладных расходов на его инициализацию. http://www.php.net/manual/en/reserved.variables.globals.php

Обновление. См. Сообщение:

$ _ ЗАПРОС не создан при использовании переменных переменных?

0 голосов
/ 22 декабря 2011

$ _ REQUEST уже является суперглобальным ", что означает, что они доступны во всех областях действия в сценарии. Нет необходимости создавать глобальную переменную $; для доступа к ним в функциях или методах."

function gg( $name, $type="_REQUEST" ) {
  switch ($type) {
  case '_REQUEST':
    return $_REQUEST[$name];
    break;
  case 'GLOBALS':
    return $_GLOBALS[$name];
    break;
  //  etc...
  default
    return false;
}
...