2012-08-14 95 views
3

我知道通過使用eval($code_to_check);我們可以檢查這個值是否等於FALSE,如果是的話,我們可以停止執行腳本。然而,我面臨的問題是我無法定義一個函數,因爲它被調用兩次......它通過eval()檢查來處理,以確保沒有語法錯誤並且再次處理該函數,但顯示一個錯誤,指出它不能REDECLARE這個函數,因爲它已經在eval'd函數中聲明瞭。我怎樣才能使它不會在EVAL'd函數中聲明,或者我們可以在我們實際調用它之前聲明所有在eval()函數中聲明的東西...PHP - 檢查PHP代碼的語法錯誤而不運行代碼

反正,這是我目前的工作......可以使用一些幫助,因爲當$ content(這是php代碼)中有一個函數時,我得到了「無法重定向函數」。

// PHP Syntax errors? 
if ([email protected]('return true;' . $content)) 
{ 
    // Error found in PHP somewhere. Call error function and return out of here! 
    call_user_func_array($code_error['function'], $code_error['params']); 
    return; 
} 
else 
{ 
    ob_start(); 

    eval($content); 
    $code = ob_get_contents(); 
    ob_end_clean(); 
} 

任何人都可以幫我嗎?謝謝你們,你們在這裏非常有幫助!您所應得的金牌,但我相信現在奧運會已經結束,這是不太運動尚未...


好吧,我在這裏嘗試我自己的答案,而這是否會仍然不知道捕獲錯誤並允許同時創建函數而不用兩次調用這些函數。這是一個正確的方法嗎?任何人都可以在此代碼中看到任何可能的問題如果沒有檢測到語法錯誤,我在迴應$ eval_code ...這樣做很好嗎?

$eval_code = @eval($content); 
// PHP Syntax errors? 
if ($eval_code === FALSE) 
{ 
    call_user_func_array($code_error['function'], $code_error['params']); 
    return; 
} 
else 
{ 
    ob_start(); 
    echo $eval_code; 
    $code = ob_get_contents(); 
    ob_end_clean(); 
} 
+4

您可以在「lint」模式下運行命令行'php'解釋器,以便在將片段存儲在臨時文件中後檢查語法。例如'exec(「php -l checkfile.php.txt」);'可以返回'沒有檢測到語法錯誤...' – mario 2012-08-14 01:32:46

+0

不,我通過PHP輸入代碼到文本區域,並希望它影響頁面在我的網站上。有時,我創建了一個函數:'function doSomething($ blah)',但是這樣做會執行兩次......真的只需要在這裏運行eval ...也許如果我爲eval()設置了一個php變量,功能??? – 2012-08-14 01:33:32

+1

'eval'不適用於代碼檢查。它馬上運行。那麼你可以跳過驗證步驟。無論如何,安全方面它是多餘的。儘管如此,如果你想在執行用戶提供的代碼之前聲明代碼的正確性,還是有用戶級的PHP解析器。 (後者是有問題的部分。) – mario 2012-08-14 01:40:17

回答

4
$checkResult = exec('echo \'<?php ' . escapeshellarg($code_to_check) . '\' | php -l >/dev/null 2>&1; echo $?'); 
if ($checkResult != 0) { 
    throw new \RuntimeException("Invalid php"); 
} else { 
    $result = eval($code_to_check); 
} 
+0

爲什麼你在前面用'\\'寫''RuntimeException'?這看起來像一個錯誤... – 2014-08-01 06:49:30

+1

不,這是正確的。這是PHP – tvlooy 2014-08-03 19:31:04

+0

的命名空間感謝您的好回答。您應該在$ code_to_check上使用escapeshellarg,否則如果php中有任何單引號檢查,代碼將會失敗。 – Matt 2016-10-05 09:36:21

0

如果檢查PHP的文檔eval(),這是描述:

EVAL - 評估一個字符串作爲PHP代碼

然而,PHP文件,本身說eval危險構造: 注意

eval()語言結構非常危險,因爲它允許 執行任意PHP代碼。因此不鼓勵它的使用。如果您 已仔細驗證除了使用此構造外沒有其他選擇,請特別注意不要將任何用戶提供的數據 加入其中,而不事先對其進行正確驗證。

所以,使用eval時要小心,非常小心。現在回到你的問題。

我認爲你在這裏需要的是一個工具,可以幫助你進行語法檢查,以檢測違反定義的編碼標準。我使用ESLint檢查Javascript代碼中的違規行爲。對於PHP,我使用PHPStorm和Sublime Text,並使用PHP Lint和PHPCS。相反做eval,我建議你使用這些或這些工具的組合來實現你的目標。

如果使用Jetbrains的PHPStorm,你可以在這裏找到這些插件:

如果你喜歡用崇高,這裏的插件爲您提供:

我的觀點是,這些很好的結合工具應該足以確保代碼的完整性。

-Thanks