超全局变量不能通过函数中的变量访问


Superglobals can't be accessed via variable variables in a function?

我不能通过函数内的变量访问超全局变量。我是问题的根源还是PHP的微妙之处?如何绕过它呢?

print_r(${'_GET'});

没问题
$g_var = '_GET';
print_r(${$g_var});

给我一个通知:未定义变量:_GET

PHP无法识别这是一个全局变量访问:
它将$_GET${'_GET'}编译成相同的操作码序列,即global FETCH_R。另一方面,${$g_var}将导致local FETCH_R

这在文档中也有提到:

超全局变量不能用作函数或类方法中的变量。

您可以使用$GLOBALS超全局变量绕过它。而不是写

function & getSuperGlobal($name) {
    return ${"_$name"};
}

你可以写

function & getSuperGlobal($name) {
    return $GLOBALS["_$name"];
}

最近的PHP版本似乎很好地处理了这个问题。下面的代码在PHP 5.5.9下运行良好。

<?php
function foo() {
  print_r(${'_SERVER'});
}
foo();

尽管,根据这里关于变量变量的文档,它们不能在函数或类方法内部的超全局变量上使用:

警告

请注意,变量变量不能在函数或类方法中与PHP的超全局数组一起使用。变量$this也是一个不能动态引用的特殊变量。

你可以通过将它们声明为全局变量或通过$GLOBALS variable

引用它们来绕过这个问题

的例子:

<?php
    function myFunc ($varname) {
        global $$varname;
        var_dump($$varname);
    }
    myFunc('_SERVER'); // works
    myFunc('_POST'); // works

    function mySecondFunc ($varname) {
        var_dump($GLOBALS[$varname]);
    }
    mySEcondFunc('_SERVER'); // works
    mySecondFunc('_POST'); // works

注意:这些对$_ENV不起作用!