$ _REQUEST superarray未在$ GLOBALS数组中初始化

时间:2011-12-22 12:37:22

标签: request php globals superglobals

问题

所以,我有这个函数从$ _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

EDIT&解

1

如找到here,最简单的解决方案是编辑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 个答案:

答案 0 :(得分:1)

无法在我的设置上复制此内容,因此可能是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 not created when using variable variables?

答案 1 :(得分:1)

只是提示:

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

答案 2 :(得分:0)

$ _ REQUEST已经是超全球"这意味着它们在整个脚本的所有范围内都可用。没有必要做全局$变量;在函数或方法中访问它们。"

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