正確理解PHP程式編譯時的錯誤資訊
編譯PHP指令碼時,PHP編譯器會盡其所能報告它遇到的第一個問題。這樣就產生一個問題:只有當錯誤出現時,PHP才能將它識別出來(本文後面對此問題 進行了詳細描述)。正是由於這個緣故,編譯器指出出錯的那行,從表面上看來可能語法正確無誤,或者可能是根本就不存在的一行!
更好地理解錯誤資訊可以大大節省確定並改正錯誤內容所花費的時間。因此,在本文中,我將努力闡明多種不同型別的PHP報錯資訊,以及在開發過程中如何正確理解各種報錯資訊的含義。
本文中所講述的內容與您所應用的PHP的版本無關,因為本文所描述的各種錯誤並不限定於某一特殊版本的特定錯誤。另外我們假定您是一位初級或者中級程式員,並已經從事程式設計工作有半年或一年的時間。
編譯器的工作方式
要搞清楚編譯器為什麼會報告某一行上存在錯誤,首先必須明確編譯器解析PHP程式碼的機制。我並不打算在本文中對此進行詳細論述,但是,我們將會討論一些更易於引發錯誤的簡單概念。
變數宣告
如果在一條語句中宣告一個變數,具體方式如下所示:
$variable = `value`;
編譯器首先求出語句右半部分的值(即等號右邊的所有內容)。在一些程式設計書籍中,將此表示為語句的 RHS (右半部分)。恰恰正是語句的這一部分常常會引發錯誤。如果使用的語法不正確,就會出現解析錯誤。
解析錯誤
Parse error:解析錯誤,unexpected T_WHILE in c:\program files\apache group\apache\htdocs\script.php on line 19
每次確定了前一錯誤時,解析錯誤一個接一個地不斷出現。因為PHP在第一個解析錯誤之後就停止執行指令碼,除錯並糾正這一系列的錯誤往往會讓人覺得特別厭煩。
而且,解析錯誤具有很少的資訊,幾乎不報告錯誤所在的行號。具體原因就是當出現錯誤時,編譯器判定好幾行的語法看起來應該是有效的,直至遇到無效的語法,最可能的情形就是表示式中使用了預定義的字詞,例如;
while = 10; // Bad ? while 就是一個預定義字詞,不能分配給一個值
預定義的字詞包括 while、function等,如果PHP使用 uses to evaluate your code. 您不能使用這些預定義字詞來命名變數,而且如果您非要這樣做的話,PHP就會報出更多的錯誤,這是您無法忍受。
關於這個問題,下面的示例可能會對您有所幫助。請諮詢閱讀一下下面所示的PHP 程式碼:
$b = somevalue
if($b == somevalue){
print Hello world!;
}
?>
錯誤位於$b =一行(在語句的末端缺少分號),所以錯誤應該是解析錯誤:第3行缺少分號對吧?而不應該依據解析器判定的:
Parse error: parse error, unexpected T_IF in c:\program files\apache
group\apache\htdocs\ereg2.php on line 4
在第4行,if() 語句的語法是正確的。那麼,編譯器是被什麼給搞糊塗了呢?線索就是unexpected T_IF 部分。出現 unexpected T_???錯誤時,它所表示的含義為:編譯器發現在預定義字不應該出現的位置出現。T_IF 代表 if(), T_WHILE 代表 while(), T_FOR 代表 for()等。
值得慶幸的是,一些錯誤的原因也很簡單:
語句沒有使用分號(;)結束,比如上面的示例。字串中缺少引號。
其他一些常見的錯誤
我見過的最常見的錯誤就是,當沒有使用大括號( } )結束一個函式或者一個迴圈時出現的錯誤,這很可能是最常見,最讓人煩的錯誤。
具體程式碼如下:
function UselessFunction() {
for($i < 0; $i < 10; $i++){
}
將產生下列錯誤:
Parse error: parse error, unexpected $ in c:\program files\apache
group\apache\htdocs\ereg2.php on line 9
由於函式 UselessFunction 沒有使用大括號( } )來結束,PHP編譯器不斷查詢表示結束的大括號直至到達檔案末尾為止。因為編譯器未找到一個匹配的大括號,就會報告檔案末尾處有錯誤。
如果正確地反映了程式碼的層次結構,錯誤資訊就會變得非常明顯。如果沒有標明程式碼的層次結構,那麼最後要想查清楚到底忘記了什麼也會變得幾乎是不可能的。 所以,請記住,一定要標明程式碼的層次結構。Tab鍵可以很容易地實現這一點。對後續的開發人員來說,把握程式碼框架並對其進行修改也會更容易一些。
MySQL 錯誤
另一極其令人討厭的錯誤資訊就是最常見的MySQL錯誤,這常常使 PHP新手感到頗為頭疼: Warning: Supplied argument is not a valid MySQL result resource in…
上面所報告有錯的一行可能是:
while($row = mysql_fetch_array($result)) {
引數 $result並不是一個有效的資源。在英語中它表示因為查詢失敗,將無法處理mysql_fetch_array。任一查詢的語法無效(您應該將查詢復 制-貼上到MySQL 控制檯參考來進行測試),或者與資料庫的連線失敗(這種情況下您應該再次檢查使用者名稱和口令等)。
防止錯誤發生
第一步,智慧程式碼器可採取以下幾步來消除下列錯誤出現:
· 在每一條語句的末尾處,不必考慮新增分號——這應該成為一種習慣。
· 總是要儘可能標明程式碼的層次結構,這可以使您能夠檢視是否忘記在if 呼叫或函式末端等位置新增大括號。
· 請使用可突出顯示語法的編輯器(如 HTML-Kit)。有了這類編輯器的輔助,您就能確定是否忘記了新增引號,是否缺少分號等。
結論
本文我們對PHP編譯器可報出的一些看起來可能沒有什麼意義的錯誤有了一定的瞭解。我們需要將所學的知識應用到如何避免錯誤以及錯誤出現時如何糾正錯 誤。除錯是一個開發人員所有工作中的最重要的部分之一。提高除錯效率可大大加快整個工作的進度,縮短完成一項工程所需花費的時間,同時還可以明顯減輕程式碼 失敗所帶來的精神壓力
相關文章
- 正確理解 PHP 錯誤資訊(轉)PHP
- C++編譯錯誤的正確查詢方式C++編譯
- 編譯PHP的錯誤編譯PHP
- PHP編譯安裝時常見錯誤解決辦法,php編譯常見錯誤PHP編譯
- php編譯小錯誤PHP編譯
- PHP編譯configure時常見錯誤,和PHP7.1.4 編譯安裝PHP編譯
- 正確理解 PHP 的過載PHP
- 前端工作流編譯正確操作流程和錯誤處理記錄前端編譯
- PHP編譯錯誤及解決辦法PHP編譯
- Java異常處理:如何寫出“正確”但被編譯器認為有語法錯誤的程式Java編譯
- Docker環境編譯時的錯誤記錄Docker編譯
- VS 編譯錯誤編譯
- php程式daemon化的正確做法PHP
- Flutter 錯誤捕獲的正確姿勢Flutter
- 程式碼裡的命名規則:錯誤的和正確的對比
- 編譯專案時出現的錯誤 線上等回覆編譯
- ipvs編譯錯誤編譯
- 經典的編譯錯誤 (轉)編譯
- LongTree的正確分析理解
- PHP Opcache 的正確使用PHPopcache
- opencv 編譯常見錯誤OpenCV編譯
- 編寫高質量的js之正確理解正規表示式回溯JS
- benq,我下了signup,編譯的時候明明編譯了Mysql.java,但在編譯別的檔案時老提示如下錯誤:ENQ編譯MySqlJava
- 編寫 SQL 程式碼時常犯的九個錯誤SQL
- 最近編譯tolua_runtime安卓編譯錯誤編譯安卓
- Mac下php常見錯誤資訊MacPHP
- 如何正確匯入mapstruct,同時避免編譯時mapstruct與lombok衝突Struct編譯Lombok
- Go 編譯時加入版本資訊Go編譯
- 正確理解ThreadLocalthread
- macbook開機登入時輸入正確的密碼卻提示密碼錯誤Mac密碼
- PHP編譯,執行make報錯PHP編譯
- 編譯EJB出現錯誤的解決編譯
- JB7的常見編譯錯誤!!編譯
- 編譯包的時候發生pls-00201錯誤編譯
- IDEA報錯java: 編譯失敗: 內部 java 編譯器錯誤IdeaJava編譯
- mysql 解決字符集錯誤 正確摘錄MySql
- C語言程式碼區錯誤以及編譯過程C語言編譯
- PHP原始碼包編譯安裝錯誤及解決方法彙總PHP原始碼編譯