1

问题

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

另一种解决方案是对除$_REQUEST之外的所有内容使用$GLOBALS数组,对于 $_REQUEST 请求,直接调用 $_REQUEST 数组:D

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

3 回答 3

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?

于 2011-12-22T12:49:07.780 回答
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];
    }
于 2011-12-22T12:52:48.790 回答
0

$_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;
}
于 2011-12-22T12:57:23.747 回答