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

时间:2018-06-23 22:53:29

标签: php scope eval

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

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

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

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

1 个答案:

答案 0 :(得分:1)

强制性免责声明:在我看来,eval()是一种代码味道。如果需要的话 除了快速,肮脏的黑客攻击之外,某种程度上,您在做错事

这就是说...据我所知,您需要运行两次eval()

您当前的代码是:

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

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

我们不想运行 it 两次;我们只需要发现它如何影响范围,就可以随意复制它。

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

$program .= "return get_defined_vars();"

一旦有了它,就可以进行赋值,其副作用仅是设置所需变量。您现在要做的就是在全局范围内执行它。

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

$names = array_keys($returnedVars);

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

$program2

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

然后通过eval()对第二个程序执行 ,变量应注入全局范围 不必大惊小怪。