无法通过函数中的变量变量访问超级全局?

时间:2011-11-09 20:23:08

标签: php

我无法通过函数内的变量变量访问superglobals。我是问题的根源还是PHP的微妙之处?以及如何绕过它?

print_r(${'_GET'});

工作正常

$g_var = '_GET';
print_r(${$g_var});

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

3 个答案:

答案 0 :(得分:11)

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

docs中也提到了这一点:

  

Superglobals不能用作函数或类方法中的变量变量。

答案 1 :(得分:1)

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

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

你可以写

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

,结果将相等。

答案 2 :(得分:0)

似乎最后的PHP版本正好处理该问题。 下一代码适用于PHP 5.5.9。

<?php

function foo() {
  print_r(${'_SERVER'});
}

foo();