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

PHP - Force eval() to run in global scope?

这不是重复的,因为我的要求是 eval() 语句必须在函数中。另外,我根本不需要函数“set_myvar”return任何东西。

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

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

我可以强制在全局范围内调用 eval(),以便程序回显 "Hello world"吗?

强制免责声明:在我自我膨胀的观点中,eval() 是一种代码味道。如果你需要它 对于快速和肮脏的 hack 以外的事情,不知何故,某处,你做错了什么

这就是说...在我看来,您需要两个 运行 的 eval()

您当前的代码是:

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

而且程序会设置一些变量,有一些副作用,而且可能也很慢。

我们不想 运行 两次;我们只需要发现它如何影响作用域,然后在闲暇时复制它。

你可以做的是向 $program 添加一个小片段,它将使用 get_defined_vars()var_export() 来提供环境的表示,该表示是有序的和机器可解析的,并且 return 那:

$program .= "return get_defined_vars();"

一旦你拥有它,你就可以拥有一个没有比设置你需要的变量更多的副作用的赋值。您现在需要做的就是在全局范围内执行它。

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

$names = array_keys($returnedVars);

然后您可以提取这些名称,并在开头添加一个 "global":

$program2

现在是 "global $var1, $var2, $var3...\n extract($returnedVars);",环境来自第一个 eval() 的 return 值。

并且通过 eval()'ing that 第二个程序,变量应该被注入全局范围 尽量不要大惊小怪。