我一直在做一个使用eval()函数的php测试,但似乎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();
}
但我收到的内容总是像“预期的那样:&lt; 1&gt;但是:&lt;&gt;”,但如果我做了
echo $test;
我可以得到1。
我已经尝试通过遵循PHP eval()手册将$更改为\ $,但它似乎打破了eval函数。 (http://php.net/manual/en/function.eval.php)
所以我现在有点堆叠,有人可以帮我解决这个问题。非常感谢你。
答案 0 :(得分:6)
请勿使用eval()
。
如果要在运行时使用名称调用用户定义的函数,例如derp
:
$functionName = 'derp';
$functionName(argument1, argument2, ...);
请注意我将functionName
加上$
作为前缀,因此我不是在调用functionName
,而是调用derp
。
因此,对于您的示例,调用用户定义的函数equals
:
$functionName = 'equals';
$functionName($test, 1);
答案 1 :(得分:4)
您遗失return
echo eval("return equals(\"$test\",1);");
来自PHP手册
eval()返回NULL,除非返回 在评估的代码中调用,其中 case传递给return的值是 回。如果有解析错误 评估的代码,eval()返回 FALSE并执行以下操作 代码继续正常。
避免使用@Delan建议的eval()。
答案 2 :(得分:0)
如果你想使用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字符串使用单引号。 正如其他人所指出的那样,可能有更好的方法来做到这一点。