PHP函數die()與exit()的真正區別
網上搜索die與exit兩個函數的區別,大部分的”標準答案”都是説die是退出並釋放內存,exit是退出但不釋放內存。
還有人説exit()並不一定就能讓程序結束,因為可以使用因為可以使用register_shutdown_function註冊一個或多個exit之後才執行的函數,並且還有對象的析構函數也會在exit之後執行。但是die()一定能結束程序。
這個問題PHP官方給的答案是兩個函數作用等同。
“die — Equivalent to exit() language construct is equivalent to exit(). ”兩者只是別名關係,除此之外完全一樣。
不過我還是很好奇,決定從源碼中找找線索,看看php是如何處理的這個“別名”。
首先要清楚一點,die和exit都是”language construct”而非函數,網上也有很多説某某某有返回值是函數,某某無返回值是結構,很多初學者總搞不清語言結構和函數的區別,用通俗點的話講,語言結構可以理解為語法本身的一種標識。像+、-、*、/這些也都是語言結構,if、else、for、while,這些都是語言結構。是語法本身的一部分。任何語言都會有這些東西,因為計算機看到+不會認為是應該做加法的。這需要編譯器轉換為機器碼也就是cpu能夠識別的指令集。
php執行源碼時的整個過程為,首先按照zend_language_scanner.l中定義的,將源碼中的echo、if之類的語言結構轉換成類似的T_ECHO、T_IF這些token,並且會去掉源碼中的空格,註釋這些與程序邏輯無關的字符。,就形成了一些簡短的.表達式,這就是詞法分析階段。然後會按照zend_vm_opcodes.h中定義的,將這些token轉換為op code。然後一條一行的執行這些op code。
上面大概解釋了php的編譯和執行的過程,以及語言結構的定義。下面進入正題。
我們也應該記得,php中有很多別名函數,比如:implode和join。無論是別名函數還是別名語言結構,從實際效果角度講,都是一樣的,不過源碼的處理方式肯定還是不一樣的。
我們先看看這個別名語言結構是如何處理的,稍後再看別名函數。
zend_language_parser.c中,定義了一個宏
#define T_EXIT 300
還定義了一個enum,裏面也有
enum yytokentype {
…
T_EXIT = 300,
….
}
這裏告訴我們,T_EXIT這個token,它的code是300。
再看zend_language_scanner.l,其中有這麼幾行代碼。
”exit” {
return T_EXIT;
}
”die” {
return T_EXIT;
}
很明顯,php做詞法分析時,無論遇到exit還是die,都會返回T_EXIT這個token。從這裏就可以證明,die和exit,再php內部處理是完全一樣的。
也可以用下列php代碼來確定:
”));
返回的結果中die和exit對應的token code,都是300。
現在關於die和exit的問題,我想大家應該可以確定了,只是名字不同,效果都是一樣的,沒有所謂的卸不卸載內存的問題。
-
MySQL 入門基礎知識
MySQL最流行的關係型數據庫管理系統,在WEB應用方面MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,關係數據庫管理系統)應用軟件之一。以下是小編為大家搜索整理的MySQL入門基礎知識,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!...
-
PHP代碼如何規範
對於PHP入門學習的童鞋來説,基礎是很重的,一定要打好基礎。那麼大家知道PHP代碼如何規範呢?下面一起來看看!瞭解PHP開發規範可以少走很多彎路,網上各種PHP開發規範也很多,我結合自身使用PHP的情況,來説説我所理解的PHP開發規範,涉及多個方面,比如PHP代碼規範、PHP文件...
-
php爬蟲程序中怎麼樣偽造ip地址防止被封
php爬蟲程序中怎麼樣偽造ip地址防止被封是很多程序員都關心的問題。下面是小編為大家帶來的'php爬蟲程序中怎麼樣偽造ip地址防止被封的知識,歡迎閲讀。代碼:代碼如下$ch=curl_init();curl_setopt($ch,CURLOPT_URL,"http://localhost/");curl_setopt($ch,CURLOPT...
-
PHP字符串函數大彙總
我們大家知道無論哪種編程語言,字符串操作都是一個重要的基礎,往往是簡單而重要。PHP給我們提供了大量的字符串操作函數,功能強大,使用也比較簡單,在這裏小編為大家總結九類字符串函數。1.查找字符位置函數strpos($str,search,[int]):查找search在$str中的第一次位...
相關文章
- A Bitter Experience in My Childhood國中英語作文
- Zend studio for eclipse中使php可以調用mysql相關函數的設置方
- JavaScript在Android的WebView中parseInt函數轉換不正確
- 如何正確區分PHP isset()與empty()的使用
- PHP中isset()與empty()的使用區別詳解
- php安裝xdebug/pear/phpunit圖文詳解
- PHP日期函數date格式化UNIX時間的方法
- One Thing I Experienced高中英語作文
- 《Right Diet To Keep Eyes Healthy》英語閲讀訓練
- php函數method-exists()與is-callable()有何區別