【问题标题】:$_REQUEST superarray not initialized in $GLOBALS array$_REQUEST 超数组未在 $GLOBALS 数组中初始化
【发布时间】:2012-01-26 02:22:48
【问题描述】:

问题

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

发现here 最简单的解决方案是编辑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

【问题讨论】:

    标签: request php globals superglobals


    【解决方案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?

    【讨论】:

    • 嗯,我已经试过了……其实这是我的初衷,但没有奏效,所以我搬到了 $GLOBALS 数组:/
    • 是的,提供的链接解决了问题,我将把这个答案添加到我的帖子中
    【解决方案2】:

    提示:

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

    【讨论】:

    • 所以你的意思是:$GLOBALS = array_merge($_REQUEST, $GLOBALS);而不是 $GLOBALS['_REQUEST'] = $REQUEST; ?
    • 请注意:“如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个”
    • 好吧,即使是这样,它也会被相同的值覆盖,因为 $_REQUEST 继承自 $_GET,并且 $_POST 和 $_COOKIE 都是空的......不过,你的解决方案也不起作用,即使你看起来最有希望:( .
    • 应该比较靠谱:if($type=="_REQUEST")return $_REQUEST[$name];
    • 是的,我知道我在测试期间解决了这个问题。编辑:不用等待,你改变了返回的数组
    【解决方案3】:

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

    【讨论】:

    • 你完全没有抓住重点:)。而且我真的不想使用 swich() 。
    猜你喜欢
    • 2012-02-15
    • 2015-10-03
    • 2019-12-05
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2014-11-30
    • 1970-01-01
    相关资源
    最近更新 更多