我知道,eval被称为“邪恶的'它似乎是一切最糟糕的方式,但...... 如何在函数外返回eval的完整结果?这只是一个错综复杂的问题,我找到了更好的解决方案。
在数据库中(想要执行):
$var1 = "yes";
$var2 = "no";
include('file.php');
功能:
function executeScriptData($id) {
$data = anydbhandler("SELECT `data` FROM `data` WHERE ID = $id");
if(trim($data['data']) != "") {
echo $data['data']; // echo data from database
return eval($data['data']);
}
}
调用函数:
executeScriptData(someID);
echo $var1; // nothing happened :(, no result
答案 0 :(得分:1)
确保在您希望的范围内进行规避(现在$var1
仅在方法executeScriptData()
中可用)。
可能的解决方案:
function executeScriptData($id) {
$data = dbhandler("SELECT `data` FROM `data` WHERE ID = $id");
if(trim($data['data']) != "") {
return $data['data'];
}
}
$data = executeScriptData(SOMEID);
eval($data);
echo $var1;
答案 1 :(得分:0)
这是不可能通过文档告诉你的返回值:
http://php.net/manual/en/function.eval.php
返回值:
eval()返回NULL,除非在计算代码中调用return,在这种情况下返回传递给return的值。如果计算代码中存在解析错误,则eval()返回FALSE并继续执行以下代码。使用set_error_handler()无法在eval()中捕获解析错误。
你在那里使用的回报是在eval的子视图中,在一个额外的函数中。此范围无法使您的评估结束。否则,eval()将无法在其内容中定义函数,因为每次出现"返回"会把传递给eval()的代码执行搞砸。
您所能做的就是在您的eval代码中创建一个var global,并在上下文中覆盖它。
$a = true;
$myVar = "abc";
eval('global $a; global $myVar; if($a == true) { $myVar = "def"; } ');
echo $myVar;