錯誤報告

配置的改變

PHP 3 錯誤報告的層級是簡單的將不同的錯誤報告層級的數字相加而成。通常 15 代表報告所有錯誤,而 7 代表報告除了 notice 訊息以外的所有錯誤。

PHP 4 有一整套錯誤和警示的層級,並且配置解析器容許使用符號常量來定義顯示的錯誤層級。

錯誤報告層級應該被明確的配置。若果不想顯示某種錯誤訊息,需要將他們從 E_ALL 符號常量中排除。聽起來很複雜嗎?讓我們看看吧。若果想顯示除了以 E_NOTICE 表示的 notice 訊息以外的所有錯誤訊息,就應該在 php.ini 中設定:error_reporting = E_ALL & ~ ( E_NOTICE ) 。若果還不想顯示 warning 訊息,只需要使用「|」運算符:error_reporting= E_ALL & ~ ( E_NOTICE | E_WARNING )

警示

當把代碼從 PHP 3 升級到 PHP 4 時,需要檢查這些設定,並呼叫 error_reporting() 函數,否則可能會屏蔽一些新的錯誤報告類型,特別是 E_COMPILE_ERROR。這可能將導致沒有任何反饋訊息的空白頁,使得會員不知道發生了什麼,也不知道問題所在。

警示

使用舊有的從 7 到 15 的數字來設定錯誤報告的層級不是個好主意,因為這屏蔽了 PHP 4 中新的錯誤類產生的錯誤訊息。這可能導致非常奇怪的現象:腳本不能執行卻沒有任何錯誤提示。

這在過去已經導致了許多重複的 bug 報告。人們報告新的腳本引擎不能追蹤腳本檔案中經常發生的缺少「}」的錯誤。事實上,這是由不正確的配置引起的。

所以,檢查錯誤報告的設定是在腳本無法運行而沒有出現錯誤提示時應做的第一件事。Zend engine 到現在已經很成熟了,一般不會出現如此奇怪的現象。

額外的警示訊息

許多已存在的 PHP 3 代碼使用的語系型態在現在應當被看做是非常糟糕的。因此,若果用 PHP 4 編譯該腳本,會產生很多額外的警示訊息。若果不想看到這些訊息,只要簡單的把 E_NOTICE 選項關閉。但更好的做法是修正代碼。

最常見的出現 notice 提示訊息的情況是在陣列索引中使用沒有加引號的字串。PHP 3 和 PHP 4 在沒有同名的常量定義時都會把它解釋為字串,但是無論何時只要有常量是以該字串命名,腳本就可能會出現錯誤。若果有黑客利用這一點,設法重定義該常量,這個腳本就存在安全漏洞。所以只要出現未加引號的索引,PHP 4 就會警示對它加以修正。舉例來說,有漏洞的代碼 $_SERVER[REQUEST_METHOD],只要將它改為 $_SERVER['REQUEST_METHOD'],錯誤提示就會消失。

PHP 4 還會對未起始化的變量或陣列元素加以提示。