錯誤控制運算子(Error Control Operator)
如同其他程式語言,有時候程式寫錯,PHP也會在執行的時候直接顯示Error或是Warning的訊息
而錯誤控制運算子(@
)可以決定這些錯誤與警告訊息要不要顯示,或是可以改成其他訊息顯示
使用時,錯誤控制運算子(@
)要放在錯誤可能會發生的運算式前面
舉例來說,故意讀取一個不存在的檔案,程式碼如下
<?php
$content = file("content.txt"); //content.txt檔案不存在
?>
由於content.txt這個檔案不存在,所以會顯示
Warning: file(content.txt): failed to open stream: No such file or directory in 檔案路徑/test.php on line 8
如果我在函數前面加上@
,使用錯誤控制運算子,這樣就不會顯示Warning
<?php
$content = @file("content.txt");
?>
甚至可以搭配die()
這個函數,加上客製化的錯誤或警告訊息
但要注意的是die()
是用來終止程式並輸出訊息的函數,程式終止之後後續的程式碼並不會執行
<?php
$content = @file("content.txt") or die('檔案存取問題');
?>
剛才的錯誤訊息會改成顯示「檔案存取問題」
而or die(...)
不一定要跟錯誤控制運算子一起使用,只要前面的運算結果是false,or die(...)
就會執行
<?php
$a = ($b * 999) or die("Test @"); //因為沒有先宣告$b,這邊會error
?>
執行結果會顯示
Notice: Undefined variable: b in 檔案路徑/test.php on line 9
Test @
這樣就能夠同時顯示錯誤訊息,跟die()
中所自訂的訊息
由於只要前方的運算式結果是false就會執行,也能這樣寫
<?php
(false) or die("FALSEEEEEEEEEE");
//顯示FALSEEEEEEEEEE
?>
也能在任何運算式前使用
<?php
$a = 57/0;
?>
這樣會出現「Division by zero」 Warning,因為數字除以0是不合法的
Warning: Division by zero in 檔案路徑/test.php on line 2
如果寫成$a = @(57/0);
就不會出現Warning句子提醒錯誤
但要小心的是,使用這種方式來抑制警告,就必須寫一些錯誤處理的程式碼去在錯誤發生的時候進行處理
否則有錯誤訊息看不到,導致系統crash,卻又抓不到哪裡出問題就很頭大了