PHP-强制eval()在全局范围内运行?

PHP-强制eval()在全局范围内运行?,php,scope,eval,Php,Scope,Eval,这不是重复的,因为我的要求是eval()语句必须在函数中。此外,我不要求函数“set_myvar”返回任何内容 假设我有这个代码(忽略它有多傻;它只是假设): 我是否可以强制在全局范围内调用eval(),以便程序响应“Hello world”?强制性免责声明:在我自我膨胀的观点中,eval()是一种代码气味。如果你需要的话 除了快速而肮脏的黑客,不知何故,在某个地方,你做错了什么 也就是说。。。在我看来,您需要运行两次eval() 您当前的代码是,比如: $program = '...'; ev

这不是重复的,因为我的要求是eval()语句必须在函数中。此外,我不要求函数“set_myvar”返回任何内容

假设我有这个代码(忽略它有多傻;它只是假设):


我是否可以强制在全局范围内调用eval(),以便程序响应“Hello world”?

强制性免责声明:在我自我膨胀的观点中,eval()是一种代码气味。如果你需要的话 除了快速而肮脏的黑客,不知何故,在某个地方,你做错了什么

也就是说。。。在我看来,您需要运行两次
eval()

您当前的代码是,比如:

$program = '...';
eval($program);
程序会设置一些变量,有一些副作用,可能也会很慢

我们不想让它运行两次;我们只需要发现它是如何影响范围的,在空闲时复制它

您可以做的是在$program中添加一小段,它将使用
get\u defined\u vars()
var\u export()
来提供环境的表示形式,该表示形式是有序的和机器可分析的,并返回:

$program .= "return get_defined_vars();"
一旦你有了它,你可以有一个分配,没有更多的副作用比设置你需要的变量。现在需要做的就是在全局范围内执行它

但使用此方法,您还可以获得该环境中变量名称的列表:

$names = array_keys($returnedVars);
然后,您可以提取这些名称,并在开始处添加“全局”:

$program2
现在是“global$var1,$var2,$var3…\n extract($returnedVars);”,环境来自第一个eval()的返回值

通过对第二个程序求值(),变量应该被注入全局范围
尽量不要大惊小怪。

你的问题和你想要的结果似乎不一样。在全局作用域中调用
eval()
意味着您希望全局作用域中的所有变量都可用于您的
eval()
。您希望的结果是,在从
set\u myvar()
调用
eval()
后,在全局范围内有可用的
$myvar
。在运行eval()之前,使用“get\u defined\u vars()”展开全局变量列表的方法非常有效。谢谢
$program2