Я не могу получить доступ к суперглобалам через переменные переменные внутри функции. Я источник проблемы или это одна из тонкостей 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();