錯誤抑制符去掉錯誤信息,eval和echo一樣並不是函數,不能使用變量函數的方法調用比如:
$func = ‘eval’
$func()這樣的調用就是無效的。它會提示沒有eval函數,如果你自己定義這麼一個函數也是有問題的。因為eval是一個關鍵字。
eval調用和include差不多,如果被包含文件中沒有明確return就返回null。如果直接eval我們需要檢查的文件會造成被檢查的文件內代碼被執行,這可不是我們想要的,我們只需要檢查一下這個文件的語法是否正確。 我們可以在要檢查的文件之前添加return 語句,讓代碼提前跳出,那麼後面的代碼就不會執行了。好的,就這麼干。代碼如下:
- < ?PHP
- if(!function_exists('PHP_check_syntax')) {
- function PHP_check_syntax($file_name,
&$error_message = null) {- $file_content = file_get_contents($file_name);
- $check_code = "return true; ?>";
- $file_content = $check_code .
$file_content . "< ?PHP ";- if(!@eval($file_content)) {
- $error_message = "file: " .
realpath($file_name) . " have syntax error";- return false;
- }
- return true;
- }
- }
- if(!PHP_check_syntax("file.PHP", $msg)) {
- echo $msg;
- }
- else {
- echo "Woohoo, OK!";
- }
- < ?PHP
- foreach:: a => b
- ?>
因為Parse error 是沒法被 set_error_handler處理函數處理的。這個異常沒辦法catch到。所以才使用了@來抑制錯誤。這帶來的問題就是我們無法得到詳細的錯誤信息。 不過目前我需要的功能也只是檢查語法是否正確。不正確的話重新編譯模板文件,就這麼簡單,至於語法錯誤,在顯示網頁的時候自然會看得到。
PHP檢查語法錯誤最好的辦法就是這個被遺棄的PHP_check_syntax這個方法回到PHP中。下次再研究下他們是出於什麼原因把這個函數去掉的。