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