2017-01-09 22 views
1

我已經在很多的Symfony束看到(也包括其他代碼)這一行:是什麼目的「@」(沉默運營商)trigger_error之前

@trigger_error('The class is deprecated', E_USER_DEPRECATED); 

根據該文件,該@運營商用於消除錯誤(http://php.net/manual/en/language.operators.errorcontrol.php)。

那麼,拋出沉默錯誤的目的是什麼?

+1

唯一能夠知道答案的人是編寫此代碼的人。你最好問問他們。 – GordonM

回答

1

正如Symfony coding conventions說:

沒有@-silencing operator,用戶需要從棄用通知退出。沉默交換了這種行爲,並允許用戶在準備好處理它們時加入(通過添加一個自定義錯誤處理程序,如Web調試工具欄或PHPUnit橋使用的自定義錯誤處理程序)。

Comment約相關的PR作者:

...有一個其他的考慮,這讓我覺得這確實是最好的:性能。我們可以在更多的語義接口背後實施觸發「選擇棄用聲明」。但是這會給需要儘可能快的事情增加開銷。這可以稱爲數千次時,這不是微觀優化。 因此,這個原始裸機php的實現可能看起來很詭異,但對我們的需求來說只是正確的實現。

0

只是推測,但可以用它來處理自定義錯誤處理程序。

實施例:

set_error_handler(function ($err_severity, $err_msg, $err_file, $err_line, array $err_context) 
{ 
    //Log the error 

    // error was suppressed with the @-operator 
    if (0 === error_reporting()) { 
     return false; 
    } 
    // handle error 

} 

因此錯誤可以被記錄(或以其他方式處理),即使它被抑制。

你不能確切地知道爲什麼要這樣做,除非有關於它的文檔。開發人員需要解釋他們爲什麼要這樣做。

+0

是的,這可能是一個原因。但是,如果用戶沒有自定義的錯誤處理程序,他會永遠不會知道該函數已被棄用,直到它被移除爲止... –

+0

大多數框架(包括Symphony)總是使用自定義錯誤處理程序。這可能就是爲什麼代碼可以依賴於在那裏並且以某種方式行事的原因。 – apokryfos