首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP -强制eval()在全局范围内运行?

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

Stack Overflow用户
提问于 2018-06-24 06:53:29
回答 1查看 411关注 0票数 0

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

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

代码语言:javascript
复制
$myvar = null;
function set_myvar(){
eval("$myvar = 'Hello world';");
}
set_myvar();
echo $myvar;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-24 06:57:15

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

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

您当前的代码是:

代码语言:javascript
复制
$program = '...';
eval($program);

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

我们不想运行两次;我们只需要发现它是如何影响作用域的,以便在空闲时复制它。

您可以做的是向$program添加一小段代码,它将使用get_defined_vars()var_export()来提供有序和机器可解析的环境的表示,并返回该代码:

代码语言:javascript
复制
$program .= "return get_defined_vars();"

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

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

代码语言:javascript
复制
$names = array_keys($returnedVars);

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

代码语言:javascript
复制
$program2

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

通过第二个程序的eval(),变量应该被注入到全局作用域中,而不会造成太大的麻烦。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51005672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档