Таким образом, у меня есть эта функция для извлечения и обработки данных из массивов $ _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');
Мне удалось упростить эту проблему до двух строк:
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
Как найдено здесь, самым простым решением было бы отредактировать php.ini и изменить там значение auto_globals_jit от On to Off.
auto_globals_jit Off
Вместо этого вы можете использовать ini_set () внутри исходного файла, но для меня это не сработало …
ini_set("auto_globals_jit", "Off");
Еще одно решение – использовать массив $ GLOBALS для всего, кроме $ _REQUEST, и для запросов $ _REQUEST напрямую обращаться к массиву $ _REQUEST: D
if($type == "REQUEST") return $_REQUEST[$name]; else return ${"_".$type}[$name]; // or $GLOBALS["_".$type][$name] if previous won't work
Не удалось воспроизвести это при моей настройке, так что это может быть проблема 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
Обновить. Посмотреть сообщение:
$ _REQUEST не создается при использовании переменных переменных?
Просто подсказка:
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]; }
$ _REQUEST уже суперглобальный, что означает, что они доступны во всех областях в сценарии. Нет необходимости делать глобальную переменную $, чтобы получить доступ к ним в рамках функций или методов ».
function gg( $name, $type="_REQUEST" ) { switch ($type) { case '_REQUEST': return $_REQUEST[$name]; break; case 'GLOBALS': return $_GLOBALS[$name]; break; // etc... default return false; }