Проблема с доступом к PHP Globals при использовании переменной переменной

У меня есть эта строка в функции класса:

$this_value = eval("return $$existing_value;");

Это дает мне значение, которое мне нужно, когда переменная $$existing_value установлена ​​в функции, но я обнаружил, что мне действительно нужен доступ к глобальной области в 99% случаев. Я пытался переписать его как $this_value = eval("return global $$existing_value;");, но это возвращает ошибку php.

Кто-нибудь знает, как я могу сделать это правильно? (кстати, я знаю о плохой практике, которую это представляет, но, учитывая ситуацию, я не могу думать ни о каких других подходах)


person YsoL8    schedule 21.02.2011    source источник
comment
Чтобы помочь людям лучше понять проблему, вам, вероятно, следует добавить ссылку на предыдущий вопрос: stackoverflow.com/questions/5065294/   -  person xzyfer    schedule 21.02.2011


Ответы (4)


Пытаться

$this_value = eval('global $existing_value; return $$existing_value;');

or

$this_value = eval('global $$existing_value; return $$existing_value;');

person Community    schedule 21.02.2011
comment
Я думаю, что вторая строка будет работать для одиночных значений, но она задыхается от массива, который я ищу. Я получаю ошибку PHP при неожиданном '[', который является открывающей скобкой для ссылки на массив. - person YsoL8; 21.02.2011
comment
я получаю ошибки при использовании двойных кавычек, возможно, это укажет вам правильное направление: `Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный T_LNUMBER в /var/www/index.php(19): код eval() в строке 1 Call Стек: 0,0006 645576 1. {main}() /var/www/index.php:0 0,0007 646552 2. sss() /var/www/index.php:22 bool(false) ` - person Poelinca Dorin; 21.02.2011
comment
@ YsoL8 Я обновил свой ответ. Я заменил двойные кавычки на одинарные. Вы пробовали это с одинарными кавычками вместо двойных кавычек? - person ; 22.02.2011

$x = 3;

function sss()
{
    $x = 1;
    $y = eval('global $x; return $x;');
    var_dump($y);
}
sss();

Выведет int(3) , так что это работает, но будьте осторожны с двойными кавычками и простыми кавычками!

person Poelinca Dorin    schedule 21.02.2011

Поскольку eval возвращает нужное вам значение, вы должны просто присвоить возвращаемое значение суперглобальным переменным $_GLOBAL или $_SESSION (предпочтительнее, потому что $_GLOBAL — это зло).

$foo['bar'] = "pie";
$fixed_name_variable = "foo['bar']";
$_GLOBAL['foo'] =  eval("return $$fixed_name_variable;");
echo $_GLOBAL['foo']; // pie
person xzyfer    schedule 21.02.2011
comment
Это добавляет значение в массив $_GLOAL, верно? Мне нужно принять значение, но посмотрите на ответ, который я дал. - person YsoL8; 21.02.2011

Я переосмыслил этот процесс. Я понял, что могу добавить новый массив с фиксированным именем, в котором различные процессы, участвующие в этой функции, могут добавлять необходимые значения программно, а не пытаться угадать имена.

Это также будет гораздо более безопасным и надежным, чем переменные переменные.

person YsoL8    schedule 21.02.2011