在PHP eval()中调用用户定义的函数

时间:2011-03-02 13:13:23

标签: php eval

我一直在做一个使用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

所以我现在有点堆叠,有人可以帮我解决这个问题。非常感谢你。

3 个答案:

答案 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并执行以下操作   代码继续正常。

eval()

避免使用@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字符串使用单引号。 正如其他人所指出的那样,可能有更好的方法来做到这一点。