PHP - заставить eval () работать в глобальном масштабе? - PullRequest
0 голосов
/ 24 июня 2018

Это не дубликат, так как мои требования заключаются в том, что оператор eval () ДОЛЖЕН быть в функции. Также я не требую, чтобы функция set_myvar вообще что-либо возвращала.

Скажите, что у меня есть этот код (игнорируйте, насколько это глупо; это просто гипотетически):

$myvar = null;
function set_myvar(){
eval("$myvar = 'Hello world';");
}
set_myvar();
echo $myvar;

Можно ли принудительно вызвать eval () в глобальной области видимости, чтобы программа отображала "Hello world"?

1 Ответ

0 голосов
/ 24 июня 2018

Обязательный отказ от ответственности: по моему мнению, eval () - это запах кода. Если вам это нужно для чего-то другого, кроме быстрого и грязного взлома, как-то где-то вы делаете что-то не так .

Тем не менее ... как я понимаю, вам нужно два прогона eval().

Ваш текущий код, скажем:

$program = '...';
eval($program);

И программа установит некоторые переменные, будет иметь некоторые побочные эффекты и, возможно, будет медленной.

Мы не хотим запускать it дважды; нам просто нужно выяснить, как это влияет на сферу, воспроизвести ее на досуге.

Что вы можете сделать, это добавить в $ program небольшой фрагмент, который будет использовать get_defined_vars() или var_export(), чтобы обеспечить представление среды, упорядоченной и обрабатываемой машиной, и вернуть следующее:

$program .= "return get_defined_vars();"

Как только вы его получите, у вас может быть назначение, у которого не будет больше побочных эффектов, чем установка нужных вам переменных. Все, что вам нужно сделать сейчас, это выполнить его в глобальной области видимости.

Но с помощью этого метода у вас также есть список имен переменных в этой среде:

$names = array_keys($returnedVars);

Затем вы можете извлечь эти имена и добавить «глобальный» в начале:

$program2

теперь «global $ var1, $ var2, $ var3 ... \ n extract ($ returnVars);» со средой из возвращаемого значения первого eval ().

И с помощью eval (), этой второй программы, переменные должны быть введены в глобальную область видимости. с минимумом суеты.

...