这不是重复的,因为我的要求是eval()语句必须在函数中。另外,我不需要“ set_myvar”函数返回任何东西。
说我有这段代码(忽略它有多愚蠢;这只是假设):
$myvar = null;
function set_myvar(){
eval("$myvar = 'Hello world';");
}
set_myvar();
echo $myvar;
我可以强制在全局范围内调用eval(),以便程序回显“ Hello world”吗?
答案 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()对第二个程序执行 ,变量应注入全局范围 不必大惊小怪。