我認(rèn)為這個話題完全討論過度/過于復(fù)雜。使用 IDE 是完全避免任何語法錯誤的方法。我什至?xí)f,在沒有 IDE 的情況下工作是一種不專業(yè)的行為。為什么?因?yàn)楝F(xiàn)代 IDE 在您鍵入每個字符后都會檢查您的語法。當(dāng)您編碼并且整行變成紅色,并且一個大警告通知顯示語法錯誤的確切類型和確切位置時(shí),那么絕對不需要搜索其他解決方案。
您將(有效地)再也不會遇到語法錯誤,因?yàn)槟阪I入時(shí)就可以正確地看到它們。說真的。
具有語法檢查功能的優(yōu)秀 IDE(所有這些都適用于 Linux、Windows 和 Mac):
PHP 屬于 C 風(fēng)格 和 命令式編程語言。它具有嚴(yán)格的語法規(guī)則,當(dāng)遇到放錯位置的符號或標(biāo)識符時(shí)無法恢復(fù)。它無法猜測您的編碼意圖。
您可以隨時(shí)采取一些基本的預(yù)防措施:
使用正確的代碼縮進(jìn),或采用任何高級的編碼風(fēng)格。 可讀性可防止違規(guī)行為。
使用IDE或編輯器對于 PHP,具有語法突出顯示。 這也有助于括號/括號平衡。
閱讀手冊中的語言參考和示例。 兩次,就熟練了。
典型的語法錯誤消息如下:
其中列出了可能語法錯誤的位置。請參閱提到的文件名和行號。
諸如T_STRING
之類的名字解釋了解析器/標(biāo)記器無法解析的符號最后處理。然而,這不一定是語法錯誤的原因。
查看以前的代碼行也很重要。通常,語法錯誤只是之前發(fā)生的意外。錯誤行號正是解析器最終放棄處理所有內(nèi)容的位置。
有很多方法可以縮小范圍并修復(fù)語法問題。
打開提到的源文件。查看提到的代碼行。
對于失控的字符串和錯位的運(yùn)算符,這通常是您找到罪魁禍?zhǔn)椎牡胤健?/p>
從左到右閱讀該行并想象每個符號的作用。
您還需要更頻繁地查看前面的行。
特別是,上一行結(jié)尾/語句處缺少 ;
分號。 (至少從風(fēng)格的角度來看。)
如果{
代碼塊}
未正確關(guān)閉或嵌套,您可能需要進(jìn)一步調(diào)查源代碼。使用適當(dāng)?shù)拇a縮進(jìn)來簡化。
看看語法著色!
字符串、變量和常量都應(yīng)該有不同的顏色。
運(yùn)算符+-*/.
也應(yīng)該著色不同。否則他們可能處于錯誤的環(huán)境中。
如果您發(fā)現(xiàn)字符串著色延伸得太遠(yuǎn)或太短,則說明您發(fā)現(xiàn)了未轉(zhuǎn)義或丟失的結(jié)束 "
或 '
字符串標(biāo)記。
兩個相鄰的相同顏色的標(biāo)點(diǎn)符號也可能意味著麻煩。通常,如果運(yùn)算符后面不是 ++
、--
或括號,則運(yùn)算符是單獨(dú)的。在大多數(shù)情況下,兩個直接相連的字符串/標(biāo)識符是不正確的。
空白是你的朋友。 遵循任何編碼風(fēng)格。
暫時(shí)打破長隊(duì)。
您可以在運(yùn)算符或常量和字符串之間自由添加換行符。然后解析器將具體化解析錯誤的行號。您可以隔離丟失或放錯位置的語法符號,而不是查看非常冗長的代碼。
將復(fù)雜的 if
語句拆分為不同的或嵌套的 if
條件。
不要使用冗長的數(shù)學(xué)公式或邏輯鏈,而是使用臨時(shí)變量來簡化代碼。 (更具可讀性=更少的錯誤。)
在以下位置之間添加換行符:
對長代碼塊進(jìn)行分區(qū)確實(shí)有助于定位語法錯誤的根源。
注釋掉違規(guī)代碼。
如果無法隔離問題根源,請開始注釋掉(從而暫時(shí)刪除)代碼塊。
一旦解決了解析錯誤,您就找到了問題根源。仔細(xì)看看那里。
有時(shí)您想暫時(shí)刪除完整的函數(shù)/方法塊。 (如果出現(xiàn)不匹配的大括號和錯誤縮進(jìn)的代碼。)
當(dāng)您無法解決語法問題時(shí),請嘗試從頭開始重寫注釋掉的部分。
作為新手,請避免一些令人困惑的語法結(jié)構(gòu)。
三元? :
條件運(yùn)算符可以壓縮代碼并且確實(shí)很有用。但它并不能在所有情況下提高可讀性。在不熟悉的情況下更喜歡簡單的 if
語句。
PHP 的替代語法 (if:
/elseif:
/endif;
) 對于模板來說很常見,但可以說不太容易遵循正常的 {
代碼 }
塊。
新手最常見的錯誤是:
缺少用于終止語句/行的分號 ;
。
"
或 '
的字符串引號不匹配,且其中未轉(zhuǎn)義引號。
被遺忘的運(yùn)算符,特別是字符串 .
連接。
不平衡(
括號)
。在報(bào)告的行中對它們進(jìn)行計(jì)數(shù)。它們的數(shù)量相等嗎?
不要忘記解決一個語法問題可以發(fā)現(xiàn)下一個語法問題。
如果您解決了一個問題,但下面的某些代碼中出現(xiàn)了其他問題,那么您基本上就走在正確的道路上了。
如果編輯后同一行中出現(xiàn)新的語法錯誤,那么您嘗試的更改可能會失敗。 (但并不總是如此。)
如果無法修復(fù),請恢復(fù)之前工作代碼的備份。
差異
。這可能有助于了解語法問題是什么。
看不見的雜散 Unicode 字符:在某些情況下,您需要在源代碼上使用十六進(jìn)制編輯器或其他編輯器/查看器。有些問題僅僅通過查看代碼是無法發(fā)現(xiàn)的。
嘗試 grep --color -P -n "\[\x80-\xFF\]" file.php
作為查找非 ASCII 符號的第一個措施。
特別是 BOM、零寬度空格或不間斷空格以及智能引號通常會出現(xiàn)在源代碼中。
注意文件中保存的換行符類型。
PHP 僅支持 \n 換行符,而不支持 \r 回車符。
對于 MacOS 用戶來說,這有時(shí)會是一個問題(即使是在 OS X 上,編輯器配置錯誤也是如此)。
通常只有在使用單行 //
或 #
注釋時(shí)才會出現(xiàn)問題。當(dāng)忽略換行符時(shí),多行 /*...*/
注釋很少會干擾解析器。
如果您的語法錯誤未通過網(wǎng)絡(luò)傳輸: 您的機(jī)器上碰巧有語法錯誤。但在線發(fā)布相同的文件不再顯示它。這只能意味著以下兩件事之一:
您正在查看錯誤的文件!
或者您的代碼包含不可見的雜散 Unicode(見上文)。 您可以輕松發(fā)現(xiàn):只需將代碼從網(wǎng)絡(luò)表單復(fù)制回文本編輯器即可。
檢查您的PHP 版本。并非所有語法結(jié)構(gòu)在每個服務(wù)器上都可用。
php -v
用于命令行解釋器
用于通過網(wǎng)絡(luò)服務(wù)器調(diào)用。
這些不一定相同。特別是在使用框架時(shí),您需要將它們匹配起來。
不要使用PHP 的保留關(guān)鍵字作為函數(shù)/方法、類的標(biāo)識符或常量。
反復(fù)試驗(yàn)是最后的手段。
如果所有其他方法都失敗,您可以隨時(shí)google您的錯誤消息。語法符號不太容易搜索(盡管 Stack Overflow 本身是通過 SymbolHound 進(jìn)行索引的)。因此,您可能需要再瀏覽幾頁才能找到相關(guān)內(nèi)容。
更多指南:
如果您的網(wǎng)站只是空白,那么通常是語法錯誤造成的。 啟用其顯示:
error_reporting = E_ALL
display_errors = 1
在您的php.ini
一般來說,或者通過 mod_php 的 .htaccess
,
甚至 .user.ini
使用 FastCGI 設(shè)置。
在損壞的腳本中啟用它為時(shí)已晚,因?yàn)?PHP 甚至無法解釋/運(yùn)行第一行。一個快速的解決方法是制作一個包裝腳本,例如 test.php
:
<?php error_reporting(E_ALL); ini_set("display_errors", 1); include("./broken-script.php");
然后通過訪問此包裝器腳本來調(diào)用失敗的代碼。
它還有助于啟用 PHP 的 error_log
并查看您的網(wǎng)絡(luò)服務(wù)器的error.log
當(dāng)腳本因 HTTP 500 響應(yīng)而崩潰時(shí)。