2011-03-02 72 views
2

我一直在做一个使用eval()函数的php测试,但似乎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(); 
} 

但我收到的是总是喜欢 “预期:< 1>却被:<>”,但如果我有做一个

echo $test; 

我可以得到1.

我试图通过遵循PHP eval()手册更改$到\ $,但它似乎打破了eval函数。 (http://php.net/manual/en/function.eval.php

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

+0

代码应该有以四个空格作为前缀的行(提示:Ctrl + K),而不是右尖括号。 – 2011-03-02 13:16:12

+0

你的问题解决了吗? – 2011-03-02 13:20:42

+0

我会先回去尝试。 Thx家伙。 – wgx731 2011-03-03 00:58:52

回答

4

你缺少return

echo eval("return equals(\"$test\",1);"); 

从PHP手册

eval()函数返回NULL,除非回报是所谓的评估代码 ,其中 情况下,通过返回的值是 回。如果 评估代码中存在解析错误,则eval()返回 FALSE,并且执行以下代码 正常继续。

eval()

避免使用eval()作为@Delan建议。

+0

thx Sharkti辛格,我会回去尝试你的答案。 – wgx731 2011-03-03 00:58:05

+0

再次,thx家伙帮助我。我错过了回报。 – wgx731 2011-03-03 14:22:30

6

请勿使用eval()

如果你想在运行时调用用户定义的函数,说,derp,名称为:

$functionName = 'derp'; 
$functionName(argument1, argument2, ...); 

注意我是如何前缀functionName$所以我不打电话functionName而是derp

所以,你的榜样,调用用户定义的函数,equals

$functionName = 'equals'; 
$functionName($test, 1); 
+0

感谢您的建议,但问题是我得到的字符串作为代码,所以很难以这种方式使用它,因为我需要做一个正则表达式来获取函数名称和参数。 – wgx731 2011-03-02 14:09:48

+0

非常有用,我不知道这件事。我虽然eval是我唯一的解决方案,但现在'eval'又是'邪恶'了。 :) – 2017-08-05 15:13:31

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字符串不求变量。正如其他人指出的,但是,可能有更好的方法来做到这一点。

+0

那么,避免'$ test'插值的唯一区别是,如果字符串不是与调用'eval()'的时候同时发生的话。在这种情况下,'eval()'时将会评估'$ test',而不是在创建字符串时。 – 2011-03-02 13:32:45

+0

好点我没有尝试离开第二个评估。当我在我的测试中没有\ $运行它时,第一个eval失败,因为您正在评估“= 1;”这在语法上是不正确的。 – david 2011-03-02 13:45:14

+0

什么版本的PHP? – david 2011-03-02 13:46:38

相关问题