Я знаю, что 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
Убедитесь, что сглаживание происходит в той области, в которой вы хотите (сейчас $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;
Это невозможно с помощью возвращаемого значения, как говорят документы:
http://php.net/manual/en/function.eval.php
Returnvalues:
eval () возвращает NULL, если return не вызывается в вычисленном коде, и в этом случае возвращается значение, переданное в return. Если в обработанном коде есть ошибка синтаксического анализа, eval () возвращает FALSE, и выполнение следующего кода продолжается нормально. Невозможно отловить ошибку разбора в eval () с помощью set_error_handler ().
Возврат, который вы используете, находится в подвале eval, в дополнительной функции. Эта область не может закончить вашу оценку. В противном случае eval () не сможет определить функции в своем содержимом, потому что каждый случай возврата приведет к нарушению выполнения кода, переданного в eval ().
Все, что вы можете сделать, это сделать var global внутри вашего eval’ed-кода и перезаписать его в контексте.
$a = true;
$myVar = "abc";
eval('global $a; global $myVar; if($a == true) { $myVar = "def"; } ');
echo $myVar;