我不能通过函数内的变量访问超全局变量。我是问题的根源还是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不起作用!