簡述:我們編寫程序時,無論怎樣小心謹(jǐn)慎,犯錯總是在所難免的。這些錯誤通常會迷惑PHP編譯器。如果開發(fā)人員無法了解編譯器報(bào)錯信息的含義,那么這些錯誤信息不僅毫無用處,還會常常讓人感到沮喪。
我們編寫程序時,無論怎樣小心謹(jǐn)慎,犯錯總是在所難免的。這些錯誤通常會迷惑PHP編譯器。如果開發(fā)人員無法了解編譯器報(bào)錯信息的含義,那么這些錯誤信息不僅毫無用處,還會常常讓人感到沮喪。
編譯PHP腳本時,PHP編譯器會盡其所能報(bào)告它遇到的第一個問題。這樣就產(chǎn)生一個問題:只有當(dāng)錯誤出現(xiàn)時,PHP才能將它識別出來(本文后面對此問題進(jìn)行了詳細(xì)描述)。正是由于這個緣故,編譯器指出出錯的那行,從表面上看來可能語法正確無誤,或者可能是根本就不存在的一行!
更好地理解錯誤信息可以大大節(jié)省確定并改正錯誤內(nèi)容所花費(fèi)的時間。因此,在本文中,我將努力闡明多種不同類型的PHP報(bào)錯信息,以及在開發(fā)過程中如何正確理解各種報(bào)錯信息的含義。
本文中所講述的內(nèi)容與您所應(yīng)用的PHP的版本無關(guān),因?yàn)楸疚乃枋龅母鞣N錯誤并不限定于某一特殊版本的特定錯誤。另外我們假定您是一位初級或者中級程序員,并已經(jīng)從事編程工作有半年或一年的時間。
編譯器的工作方式:
要搞清楚編譯器為什么會報(bào)告某一行上存在錯誤,首先必須明確編譯器解析PHP代碼的機(jī)制。我并不打算在本文中對此進(jìn)行詳細(xì)論述,但是,我們將會討論一些更易于引發(fā)錯誤的簡單概念。
變量聲明:
如果在一條語句中聲明一個變量,具體方式如下所示: $variable = 'value';
編譯器首先求出語句右半部分的值(即等號右邊的所有內(nèi)容)。在一些編程書籍中,將此表示為語句的 RHS (右半部分)。恰恰正是語句的這一部分常常會引發(fā)錯誤。如果使用的語法不正確,就會出現(xiàn)解析錯誤。
解析錯誤:Parse error:解析錯誤,unexpected T_WHILE in c:program filesapache groupapachehtdocsscript.php on line 19
每次確定了前一錯誤時,解析錯誤一個接一個地不斷出現(xiàn)。因?yàn)镻HP在第一個解析錯誤之后就停止執(zhí)行腳本,調(diào)試并糾正這一系列的錯誤往往會讓人覺得特別厭煩。
而且,解析錯誤具有很少的信息,幾乎不報(bào)告錯誤所在的行號。具體原因就是當(dāng)出現(xiàn)錯誤時,編譯器判定好幾行的語法看起來應(yīng)該是有效的,直至遇到無效的語法,最可能的情形就是表達(dá)式中使用了預(yù)定義的字詞,例如:
while = 10; // Bad ? while 就是一個預(yù)定義字詞,不能分配給一個值