$_REQUEST 未在数组中初始化$GLOBALS超级阵列


$_REQUEST superarray not initialized in $GLOBALS array

>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;
}