>PROBLEM
因此,我有这个函数来检索和处理 $_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
阿拉伯数字
取而代之的是,您可以在源文件中使用 ini_set((,但它对我不起作用......
ini_set("auto_globals_jit", "Off");
3
另一种解决方案是将数组用于除 $_REQUEST 之外的所有内容$GLOBALS对于 $_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 已经是一个超全局的"这意味着它们在整个脚本的所有范围内都可用。没有必要做全局$variable;在函数或方法中访问它们。
function gg( $name, $type="_REQUEST" ) {
switch ($type) {
case '_REQUEST':
return $_REQUEST[$name];
break;
case 'GLOBALS':
return $_GLOBALS[$name];
break;
// etc...
default
return false;
}