我們編寫程序時無論怎樣小心謹慎犯錯總是在所難免的這些錯誤通常會迷惑PHP編譯器如果開發人員無法了解編譯器報錯信息的含義那麼這些錯誤信息不僅毫無用處還會常常讓人感到沮喪
編譯PHP腳本時PHP編譯器會盡其所能報告它遇到的第一個問題這樣就產生一個問題只有當錯誤出現時PHP才能將它識別出來(本文後面對此問題進行了詳細描述)正是由於這個緣故編譯器指出出錯的那行從表面上看來可能語法正確無誤或者可能是根本就不存在的一行!
更好地理解錯誤信息可以大大節省確定並改正錯誤內容所花費的時間因此在本文中我將努力闡明多種不同類型的PHP報錯信息以及在開發過程中如何正確理解各種報錯信息的含義
本文中所講述的內容與您所應用的PHP的版本無關因為本文所描述的各種錯誤並不限定於某一特殊版本的特定錯誤另外我們假定您是一位初級或者中級程序員並已經從事編程工作有半年或一年的時間
編譯器的工作方式
要搞清楚編譯器為什麼會報告某一行上存在錯誤首先必須明確編譯器解析PHP代碼的機制我並不打算在本文中對此進行詳細論述但是我們將會討論一些更易於引發錯誤的簡單概念
變量聲明
如果在一條語句中聲明一個變量具體方式如下所示
$variable =
value
;
編譯器首先求出語句右半部分的值(即等號右邊的所有內容)在一些編程書籍中將此表示為語句的 RHS (右半部分)恰恰正是語句的這一部分常常會引發錯誤如果使用的語法不正確就會出現解析錯誤
解析錯誤
Parse error:解析錯誤unexpected T_WHILE in c:\\program files\\apache group\\apache\\htdocs\\scriptphp on line
每次確定了前一錯誤時解析錯誤一個接一個地不斷出現因為PHP在第一個解析錯誤之後就停止執行腳本調試並糾正這一系列的錯誤往往會讓人覺得特別厭煩
而且解析錯誤具有很少的信息幾乎不報告錯誤所在的行號具體原因就是當出現錯誤時編譯器判定好幾行的語法看起來應該是有效的直至遇到無效的語法最可能的情形就是表達式中使用了預定義的字詞例如
while = ; // Bad ? while 就是一個預定義字詞不能分配給一個值
預定義的字詞包括 whilefunction等如果PHP使用 uses to evaluate your code 您不能使用這些預定義字詞來命名變量而且如果您非要這樣做的話PHP就會報出更多的錯誤這是您無法忍受
關於這個問題下面的示例可能會對您有所幫助請咨詢閱讀一下下面所示的PHP代碼
﹤?php
$b = somevalue
if($b == somevalue){
print Hello world!;
}
?﹥
錯誤位於$b =一行(在語句的末端缺少分號)所以錯誤應該是解析錯誤:第行缺少分號對吧?而不應該依據解析器判定的
Parse error: parse error
unexpected T_IF in c:\\program files\\apache
group\\apache\\htdocs\\ereg
php on line
在第行if() 語句的語法是正確的那麼編譯器是被什麼給搞糊塗了呢?線索就是unexpected T_IF 部分出現 unexpected T_???錯誤時它所表示的含義為編譯器發現在預定義字不應該出現的位置出現T_IF 代表 if() T_WHILE 代表 while() T_FOR 代表 for()等
值得慶幸的是一些錯誤的原因也很簡單
語句沒有使用分號(;)結束比如上面的示例字符串中缺少引號
其他一些常見的錯誤
我見過的最常見的錯誤就是當沒有使用大括號( } )結束一個函數或者一個循環時出現的錯誤這很可能是最常見最讓人煩的錯誤
具體代碼如下
function UselessFunction() {
for($i <
; $i <
; $i++){
}
將產生下列錯誤
Parse error: parse error
unexpected $ in c:\\program files\\apache
group\\apache\\htdocs\\ereg
php on line
由於函數 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 調用或函數末端等位置添加大括號
◆請使用可突出顯示語法的編輯器(如 HTMLKit)有了這類編輯器的輔助您就能確定是否忘記了添加引號是否缺少分號等
結論
本文我們對PHP編譯器可報出的一些看起來可能沒有什麼意義的錯誤有了一定的了解我們需要將所學的知識應用到如何避免錯誤以及錯誤出現時如何糾正錯誤調試是一個開發人員所有工作中的最重要的部分之一提高調試效率可大大加快整個工作的進度縮短完成一項工程所需花費的時間同時還可以明顯減輕代碼失敗所帶來的精神壓力
From:http://tw.wingwit.com/Article/program/PHP/201311/21467.html