这不是重复的,因为我的要求是eval()语句必须在函数中。此外,我根本不要求函数“set_myvar”返回任何内容。
假设我有这样的代码(忽略它有多傻;它只是一个假设):
$myvar = null;
function set_myvar(){
eval("$myvar = 'Hello world';");
}
set_myvar();
echo $myvar;
我是否可以强制在全局范围内调用eval(),以便程序回显"Hello world"?
发布于 2018-06-24 06:57:15
强制免责声明:在我自我膨胀的观点中,eval()是一种代码味道。如果你需要它而不是为了快速和肮脏的黑客,不知何故,在某些地方,你做错了什么。
也就是说..。在我看来,您需要运行两次eval()
。
您当前的代码是:
$program = '...';
eval($program);
而且程序会设置一些变量,有一些副作用,也可能会很慢。
我们不想运行两次;我们只需要发现它是如何影响作用域的,以便在空闲时复制它。
您可以做的是向$program添加一小段代码,它将使用get_defined_vars()
或var_export()
来提供有序和机器可解析的环境的表示,并返回该代码:
$program .= "return get_defined_vars();"
一旦你有了它,你就可以有一个除了设置你需要的变量之外没有更多副作用的赋值。您现在需要做的就是在全局范围内执行它。
但是使用这种方法,您还可以获得该环境中变量的名称列表:
$names = array_keys($returnedVars);
然后,您可以提取这些名称,并在开头添加"global“:
$program2
现在是“全局$var1,$var2,$var3...\n extract($returnedVars);”,环境来自第一个eval()的返回值。
通过第二个程序的eval(),变量应该被注入到全局作用域中,而不会造成太大的麻烦。
https://stackoverflow.com/questions/51005672
复制相似问题