2011-03-02 28 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

相關問題