|
|
|
|
|
在php程序運行時,如果某語句出現(xiàn)錯誤,則會在網(wǎng)頁上顯示錯誤信息,但是有時候,我們并不希望顯示這個錯誤信息,而是忽略它,取而代之的是顯示其他提示信息。這就需要用到@ or die()這個語法了。不過在使用這個語法之前,我們需要弄明白一些事情,因為有時候使用它你會得到意想不到的后果。
php忽略錯誤符號 @
@是php語言里的一個忽略錯誤的字符,當(dāng)將其放置在一個 PHP 表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯誤信息都被忽略掉。例如:
@include("file.php");
需要注意的是,@ 運算符只對表達(dá)式有效。可以這樣理解,如果能從某處得到值,就能在它前面加上 @ 運算符。例如,可以把它放在變量、函數(shù)和 include 調(diào)用、常量等等之前。不能把它放在函數(shù)或類的定義之前,也不能用于條件結(jié)構(gòu)例如 if 和 foreach 等。
另外,@通常是與or die()一同使用,例如:
(@include("file.php"))
OR die("Could not find file.php!");
上述語句的意思是,如果包含file.php不成功的話,比如file.php文件不存在時,則在網(wǎng)頁上打印“Could not find file.php!”,并且立即停止程序的執(zhí)行。
如果沒有加@這個字符,那么當(dāng)include("file.php")返回錯誤時,網(wǎng)頁上打印的是:
Warning: include(file.php) [function.include]: failed to open stream: No such file or directory
Warning: include() [function.include]: Failed opening 'file.php' for inclusion (include_path='.;C:\php5\pear')
有關(guān)or die()一些用法
die()函數(shù)大家用得很熟了,不過or die()這樣的寫法,所產(chǎn)生的一些效果你也許還不知道。
首先理解下die()。
◆die定義和用法
die() 函數(shù)輸出一條消息,并退出當(dāng)前腳本。
◆語法
die(status)
status 必需。規(guī)定在退出腳本之前寫入的消息或狀態(tài)號。狀態(tài)號不會被寫入輸出。
如果 status 是字符串,則該函數(shù)會在退出前輸出字符串。
如果 status 是整數(shù),這個值會被用作退出狀態(tài)。退出狀態(tài)的值在 0 至 254 之間。退出狀態(tài) 255 由 PHP 保留,不會被使用。狀態(tài) 0 用于成功地終止程序。
注:如果 PHP 的版本號大于等于 4.2.0,那么在 status 是整數(shù)的情況下,不會輸出該參數(shù)。
◆php or die() 語句
經(jīng)??吹竭@樣的語句:
$file = fopen($filename, 'r') or die("抱歉,無法打開: $filename");
or在這里是這樣理解的,因為在PHP中并不區(qū)分?jǐn)?shù)據(jù)類型,所以$file既可以是int也可以bool,所以這樣的語句不會報錯。但其處理過程可能有些朋友不大明白。 其實在大多數(shù)的語言中, bool or bool這樣的語句中,如果前一個值為真后一個值就不會再判斷了。這里也是的,所以如果fopen函數(shù)執(zhí)行正確的話,會返回一個大于0的int值(這其實就是"真"),后面的語句就不會執(zhí)行了。如果fopen函數(shù)執(zhí)行失敗,就會返回false,那么就會判斷后面的表達(dá)式是否為真了。 結(jié)果執(zhí)行了die()之后,不管返回什么,程序都已經(jīng)停止執(zhí)行了,并且顯示指定的出錯信息,也就達(dá)到了調(diào)試的目的。 就這樣。
通常與錯誤管理一起使用的兩個函數(shù)是die()和exit()(嚴(yán)格說來,它們是語言構(gòu)造而不是函數(shù),但是誰在意這些呢)。當(dāng)在腳本中調(diào)用die()和exit()時,將會終止整個腳本。它們都可用于阻止腳本繼續(xù)執(zhí)行,而使得某些重要的操作(如建立一條數(shù)據(jù)庫連接)不會發(fā)生。你還可以給die()和exit()傳遞一個將在瀏覽器中打印出來的字符串。
通??梢钥吹皆贠R條件語句中使用die()和exit()。例如
include('config.inc.php') OR die ('Could not open the file. ');
在包含這樣一行代碼之后,如果PHP不能包含配置文件,將會執(zhí)行die()語句,并且會打印could not open the file消息。
!defined('CURSCRIPT') && define('CURSCRIPT', ");//意思是如果沒定義CURSCRIPT常量,則定義CURSCRIPT為空.
在全書和PHP手冊中,你將會看到它的各種變體,因為它是一種處理錯誤的快捷方式(但可能處理過度),而無需使用自定義的錯誤處理程序。
其實die和exit是等價的,用來終止當(dāng)前腳本,常用在調(diào)試程序的時候。參考:php斷點調(diào)試的幾種方法討論。
php @ 忽略錯誤需謹(jǐn)慎使用
目前的“@”錯誤控制運算符前綴甚至使導(dǎo)致腳本終止的嚴(yán)重錯誤的錯誤報告也失效。這意味著如果在某個不存在或者敲錯了字母的函數(shù)調(diào)用前用了“@”來抑制錯誤信息,那腳本會沒有任何跡象顯示原因而死在那里。例如:
@include("file.php");
這樣的語法,當(dāng)返回錯誤時,程序會立即停止,不再會執(zhí)行此語句后面的語句,但是網(wǎng)頁上會是一片空白。這將會給我們檢查程序帶來很大的麻煩。
因此,在使用@忽略錯誤時,務(wù)必同時加上or die()來打印相印的錯誤描述。