PHP 支持一個(gè)錯(cuò)誤控制運(yùn)算符:@
。當(dāng)將其放置在一個(gè) PHP
表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯(cuò)誤診斷都被抑制。
如果用 set_error_handler()
設(shè)定了自定義的錯(cuò)誤處理函數(shù),即使診斷信息被抑制,也仍然會(huì)被調(diào)用,因此自定義錯(cuò)誤處理函數(shù)應(yīng)該調(diào)用
error_reporting(),并驗(yàn)證 @
操作符是否按照如下方式使用:
<?php
function my_error_handler($err_no, $err_msg, $filename, $linenum) {
if (!(error_reporting() & $err_no)) {
return false; // 靜默
}
// ...
}
?>
PHP 8.0.0 之前,如果診斷被抑制,則傳遞給自定義錯(cuò)誤處理函數(shù)的嚴(yán)重性值則始終為 0
。
PHP 8.0.0 起,情況則不再如此。
error_get_last() 返回?cái)?shù)組中的 "message"
元素儲(chǔ)存了表達(dá)式產(chǎn)生的任意錯(cuò)誤信息。
此函數(shù)的返回結(jié)果會(huì)隨著每次錯(cuò)誤的發(fā)生而相應(yīng)變化,所以需要盡早檢查。
<?php
/* 故意文件錯(cuò)誤 */
$my_file = @file ('non_existent_file') or
die ("Failed opening file: error was '" . error_get_last()['message'] . "'");
// 這適用于所有表達(dá)式,而不僅僅是函數(shù):
$value = @$cache[$key];
// 如果索引 $key 不存在,則不會(huì)發(fā)出通知。
?>
注意:
@
運(yùn)算符只對(duì) 表達(dá)式 有效。 對(duì)新手來說一個(gè)簡(jiǎn)單的規(guī)則就是:如果能從某處獲得值,就能在它前面加上@
運(yùn)算符。例如,可以把它放在變量,函數(shù)調(diào)用,某些語言構(gòu)造調(diào)用(例如 include )等等之前。 不能把它放在函數(shù)或類的定義之前,也不能用于條件結(jié)構(gòu)例如if
和 foreach 等。
PHP 8.0.0 之前,@
運(yùn)算符會(huì)禁用導(dǎo)致腳本停止運(yùn)行的嚴(yán)重錯(cuò)誤。
例如在調(diào)用一個(gè)不存在的函數(shù)前添加 @
,由于函數(shù)不可用或者輸入錯(cuò)誤,
將會(huì)導(dǎo)致腳本終止,而不會(huì)說明原因。