2011-08-09 51 views
4

我有一些變量可能會或可能不會被定義(一個$isLoggedIn布爾值),我試圖清除錯誤消息。我想知道是否有任何理由我不應該使用錯誤抑制操作:何時抑制PHP中的錯誤

if (@$isLoggedIn) 

或者我應該將檢查的變量的第一個所有腦幹:

if (isset($isLoggedIn)and$isLoggedIn) 

在生產環境中這兩種方法都有什麼缺點/好處?這兩個語句的功能是相同的,並且沒有任何問題導致此var未定義。它不應該被記錄爲錯誤。

+0

+1。希望別人會從答案 – adlawson

回答

3

以我的經驗,你絕不應該在個人層面上壓制錯誤。在生產環境中,將錯誤報告設置爲0並顯示錯誤消失。當你回來修復6個月內的錯誤時,像這樣的個人壓力會讓你自己陷入腳下,忘記它在那裏,並且無法弄清楚爲什麼沒有錯誤出現,但有些事情明顯被打破。

在你特殊情況下,只需將$ isLoggedIn設置爲false,然後在當前正在實例化它的位置覆蓋該值(我在此假設代碼結構)。

3

如果你正在使用一個變量,它應該存在。你的代碼不應該壓制錯誤,你應該修復它們或處理它們。

+0

中學習,我看到這有一個-1。不知道爲什麼,因爲這是很好的建議。 – GolezTrol

+0

@goleztroll我認爲有人只是低估了我,因爲我今天發佈了很長很長的答案。 – Incognito

0

最邏輯的方式將始終聲明的變量 - 尤其是像$isLoggedIn的重要一員 - 和檢查,如果這是真的:

if ($isLoggedIn) 

或僅設置它,如果這是真的:

if (isset($isLoggedIn) 

在我看來,第一種選擇更好,混合兩種都不是一個好的解決方案!

1

在您的代碼中有一堆錯誤抑制器會使維護變得更加困難,特別是對於您以外的人員。下一個人現在必須學會以他習慣的不同方式來看代碼。壓制只是一種破解,並會導致其他人試圖找出爲什麼存在黑客可能會減慢任何調試工作。

做一個if(@ $ var)會產生與if(!empty($ var))相同的結果,所以只需使用它,因爲它是檢查它的語義更正確的方法。

1

http://php.net/manual/en/language.operators.errorcontrol.php

你的變量應始終存在,至少它初始化爲false,並登錄後,將其設置爲true。在抑制方面,我建議採用第二種方法。

警告

目前的「@」錯誤控制運算符前綴甚至禁用錯誤的,將終止腳本執行關鍵錯誤報告。除此之外,這意味着如果您使用「@」來抑制某個函數的錯誤,並且它不可用或錯誤輸入,那麼腳本就會在那裏死去,而不會顯示原因。

+0

謝謝,我不知道@是否會抑制嚴重錯誤。我只是設置變量......這不是我的代碼,所以我不想挖掘並糾正這樣一個小問題,但我想這是重構的一部分。 –

0

如果我不能肯定,如果一個變量被設置,但我想知道如果這是真的話,我寫:

if(!empty($var)){} 

但儘管如此,所以你總是一定的,你應該組織你的代碼關於你的變量。 你應該避免全局變量。

0

我認爲最好的選擇不是使用PHP的基本警告系統,而是儘可能使用可用的異常處理。將警告也轉換爲異常,因此您可以用相同的方式處理所有內容。

您可以捕獲特定的錯誤。沒有被特定處理程序捕獲的全局錯誤可以並且應該被常規處理程序捕獲。這樣,您可以捕獲所有這些錯誤,並將其報告到日誌中和/或將它們發送給開發部門(或您自己)。

對於用戶,您不應在生產環境中顯示這些錯誤,尤其是當它們包含SQL錯誤或有關缺少變量的消息時。通過顯示一些常規內容和一般的,用戶友好的錯誤消息(如果必須的話),使頁面優雅地死去,但保持隱藏的技術內容。

但永遠不要忽略或隱藏異常,因爲它會使調試成爲一個活生生的地獄。

1

永遠不要允許PHP在公共網站上向瀏覽器寫入錯誤消息。你應該總是記錄它們,只要有可能,你應該在你的代碼中處理它們 - 即使它是通過set_error_handler()的方式。

現在,我們已經得到了出路....

這是一個警告,而不是錯誤。

是的,警告信息有時可以是PITA。但有些人喜歡嚴格的變量檢查。使用抑制運算符提供了比抑制所有E_STRICT消息更有針對性的方法,因此即使我喜歡PHP支持允許使用不帶聲明的變量,但這是我所做的(並且在適當的地方也使用try {} catch()) 。

因此,使用哪種方法是合適的 - 但是在不抑制時記錄這些警告 - 這些都是您需要修復的事情 - 即使修復只是添加抑制。

+0

我不會讓它輸出生產中的錯誤當然,但我想爲prod網站記錄相關錯誤。正如其他人所說,我只是要實例化變量。 –