Я выполнял php-тестирование, которое использует функцию eval (), но кажется, что eval () не может правильно вызывать пользовательские функции.
См. Мой пример:
function equals($a,$b){ if ($t == $r){ return true; } else{ throw new Exception("expected:<".$r."> but was:<".$t.">"); } } eval("$test = 1;"); try{ echo eval("equals($test,1);"); } catch (Exception $e) { echo $e->getMessage(); }
но то, что я получил, всегда похоже на «ожидаемое: <1>, но было: <>», но если я сделаю
echo $test;
Я могу получить 1.
Я попытался изменить $ to \ $, следуя руководству PHP eval (), но, похоже, он нарушает функцию eval. ( http://php.net/manual/en/function.eval.php )
Так что теперь я немного стекаюсь, может кто-то поможет мне в этой проблеме. Большое спасибо.
вам не хватает return
echo eval("return equals(\"$test\",1);");
Из руководства по PHP
eval () возвращает NULL, если в вычисленном коде не вызван возврат, и в этом случае возвращается значение, переданное в return. Если в оцененном коде есть ошибка синтаксического анализа, eval () возвращает FALSE, и выполнение следующего кода продолжается нормально.
Eval ()
избегать использования eval (), как предложил @Delan.
Не используйте eval()
.
Если вы хотите вызвать пользовательскую функцию, скажем, derp
, с именем во время выполнения:
$functionName = 'derp'; $functionName(argument1, argument2, ...);
Обратите внимание, как я префикс functionName
с $
поэтому я не derp
functionName
а скорее derp
.
Итак, для вашего примера, вызывая пользовательскую функцию, equals
:
$functionName = 'equals'; $functionName($test, 1);
Если вы хотите использовать eval, я считаю, что проблема в том, что вам нужно избежать обоих $ (это было не ясно из вашего поста, если вы это сделали). Таким образом, ваш код будет читать
function equals($a,$b){ if ($t == $r){ return true; } else { throw new Exception("expected:<".$r."> but was:<".$t.">"); } } eval("\$test = 1;"); try{ echo eval("equals(\$test,1);"); } catch (Exception $e) { echo $e->getMessage(); }
Вы также можете использовать одинарные кавычки для ваших строк eval, которые не оценивают переменные. Как указывали другие, однако, могут быть лучшие способы сделать это.