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 第二个程序,变量应该被注入全局范围
尽量不要大惊小怪。
这不是重复的,因为我的要求是 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 第二个程序,变量应该被注入全局范围 尽量不要大惊小怪。