錯誤控制運算子(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,卻又抓不到哪裡出問題就很頭大了

results matching ""

    No results matching ""