正確理解PHP程序編譯時的錯誤信息

咱們網站建設編寫程序時,不管怎樣當心謹慎,犯錯老是在所不免的。這些錯誤一般會迷惑PHP編譯器。若是開發人員沒法瞭解編譯器報錯信息的含義,那麼這些錯誤信息不只毫無用處,還會經常讓人感到沮喪。php

編 譯PHP腳本時,PHP編譯器會盡其所能報告它遇到的第一個問題。這樣就產生一個問題:只有當錯誤出現時,PHP才能將它識別出來(本文後面對此問題進行 了詳細描述)。正是因爲這個緣故,編譯器指出出錯的那行,從表面上看來可能語法正確無誤,或者多是根本就不存在的一行!mysql

更好地理解錯誤信息能夠大大節省肯定並改正錯誤內容所花費的時間。所以,在本文中,我將努力闡明多種不一樣類型的PHP報錯信息,以及在開發過程當中如何正確理解各類報錯信息的含義。程序員

本文中所講述的內容與您所應用的PHP的版本無關,由於本文所描述的各類錯誤並不限定於某一特殊版本的特定錯誤。另外咱們假定您是一位初級或者中級程序員,並已經從事編程工做有半年或一年的時間。sql

編譯器的工做方式數據庫

要搞清楚編譯器爲何會報告某一行上存在錯誤,首先必須明確編譯器解析PHP代碼的機制。我並不打算在本文中對此進行詳細論述,可是,咱們將會討論一些更易於引起錯誤的簡單概念。apache

變量聲明編程

若是在一條語句中聲明一個變量,具體方式以下所示:框架

$variable = 'value';less

編譯器首先求出語句右半部分的值(即等號右邊的全部內容)。在一些編程書籍中,將此表示爲語句的 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代碼:

﹤?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編譯器可報出的一些看起來可能沒有什麼意義的錯誤有了必定的瞭解。咱們須要將所學的知識應用到如何避免錯誤以及錯誤出現時如何糾正錯誤。調 試是一個開發人員全部工做中的最重要的部分之一。提升調試效率可大大加快整個工做的進度,縮短完成一項工程所需花費的時間,同時還能夠明顯減輕代碼失敗所 帶來的精神壓力。(fblww-0223)

相關文章
相關標籤/搜索