Обязательный отказ от ответственности: по моему мнению, 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 (), этой второй программы, переменные должны быть введены в глобальную область видимости.
с минимумом суеты.