如何将完整的eval结果作为函数的返回值

时间:2014-11-20 15:01:37

标签: php function eval

我知道,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

2 个答案:

答案 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;