我无法通过函数内的变量变量访问superglobals。我是问题的根源还是PHP的微妙之处?以及如何绕过它?
print_r(${'_GET'});
工作正常
$g_var = '_GET';
print_r(${$g_var});
给我一个通知:未定义的变量:_GET
答案 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();