php die()與exit()的區(qū)別實(shí)例詳解
網(wǎng)上搜索die與exit兩個(gè)函數(shù)的區(qū)別,大部分的”標(biāo)準(zhǔn)答案”都是說(shuō)die是退出并釋放內(nèi)存,exit是退出但不釋放內(nèi)存。
這個(gè)解釋顯然是錯(cuò)的,PHP手冊(cè)中已經(jīng)說(shuō)過(guò)“die — Equivalent to exit().This language construct is equivalent to exit(). ”兩者只是別名關(guān)系,除此之外完全一樣。
不過(guò)我還是很好奇,決定從源碼中找找線索,看看php是如何處理的這個(gè)“別名”。
首先要清楚一點(diǎn),die和exit都是”language construct”而非函數(shù),網(wǎng)上也有很多說(shuō)某某某有返回值是函數(shù),某某無(wú)返回值是結(jié)構(gòu),很多初學(xué)者總搞不清語(yǔ)言結(jié)構(gòu)和函數(shù)的區(qū)別,用通俗點(diǎn)的話講,語(yǔ)言結(jié)構(gòu)可以理解為語(yǔ)法本身的一種標(biāo)識(shí)。像+、-、*、/這些也都是語(yǔ)言結(jié)構(gòu),if、else、for、while,這些都是語(yǔ)言結(jié)構(gòu)。是語(yǔ)法本身的一部分。任何語(yǔ)言都會(huì)有這些東西,因?yàn)橛?jì)算機(jī)看到+不會(huì)認(rèn)為是應(yīng)該做加法的。這需要編譯器轉(zhuǎn)換為機(jī)器碼也就是cpu能夠識(shí)別的指令集。
php執(zhí)行源碼時(shí)的整個(gè)過(guò)程為,首先按照zend_language_scanner.l中定義的,將源碼中的echo、if之類的語(yǔ)言結(jié)構(gòu)轉(zhuǎn)換成類似的T_ECHO、T_IF這些token,并且會(huì)去掉源碼中的空格,注釋這些與程序邏輯無(wú)關(guān)的字符。,就形成了一些簡(jiǎn)短的表達(dá)式,這就是詞法分析階段。然后會(huì)按照zend_vm_opcodes.h中定義的,將這些token轉(zhuǎn)換為op code。然后一條一行的執(zhí)行這些op code。
上面大概解釋了php的編譯和執(zhí)行的過(guò)程,以及語(yǔ)言結(jié)構(gòu)的定義。下面進(jìn)入正題。
我們也應(yīng)該記得,php中有很多別名函數(shù),比如:implode和join。無(wú)論是別名函數(shù)還是別名語(yǔ)言結(jié)構(gòu),從實(shí)際效果角度講,都是一樣的,不過(guò)源碼的處理方式肯定還是不一樣的。
我們先看看這個(gè)別名語(yǔ)言結(jié)構(gòu)是如何處理的,稍后再看別名函數(shù)。
zend_language_parser.c中,定義了一個(gè)宏
#define T_EXIT 300
還定義了一個(gè)enum,里面也有
enum yytokentype { … T_EXIT = 300, …. }
這里告訴我們,T_EXIT這個(gè)token,它的code是300。
再看zend_language_scanner.l,其中有這么幾行代碼。
<ST_IN_SCRIPTING>”exit” { return T_EXIT; } <ST_IN_SCRIPTING>”die” { return T_EXIT; }
很明顯,php做詞法分析時(shí),無(wú)論遇到exit還是die,都會(huì)返回T_EXIT這個(gè)token。從這里酒可以證明,die和exit,再php內(nèi)部處理是完全一樣的。
也可以用下列php代碼來(lái)確定:
<?php var_dump(token_get_all(“<?php die;exit;?>”));
返回的結(jié)果中die和exit對(duì)應(yīng)的token code,都是300。
現(xiàn)在關(guān)于die和exit的問(wèn)題,我想大家應(yīng)該可以確定了,只是名字不同,效果都是一樣的,沒有所謂的卸不卸載內(nèi)存的問(wèn)題。
PHP手冊(cè):die()Equivalent to exit()。
說(shuō)明:die()和exit()都是中止腳本執(zhí)行函數(shù);其實(shí)exit和die這兩個(gè)名字指向的是同一個(gè)函數(shù),die()是exit()函數(shù)的別名。該函數(shù)只接受一個(gè)參數(shù),可以是一個(gè)程序返回的數(shù)值或是一個(gè)字符串,也可以不輸入?yún)?shù),結(jié)果沒有返回值。
參考:雖然兩者相同,但通常使用中也有細(xì)微的選擇性。例如:
當(dāng)傳遞給exit和die函數(shù)的值為0時(shí),意味著提前終止腳本的執(zhí)行,通常用exit()這個(gè)名字。
echo "1111"; exit(0); echo "2222"; //22222不會(huì)被輸出,因?yàn)槌绦蜻\(yùn)行到exit(0)時(shí),腳本已經(jīng)被提前終止,“馬上斷氣”。
當(dāng)程序出錯(cuò)時(shí),可以給它傳遞一個(gè)字符串,它會(huì)原樣輸出在系統(tǒng)終端上,通常使用die()這個(gè)名字。
$fp=fopen("./readme.txt","r") or die("不能打開該文件");
這種情況下,如果fopen函數(shù)被調(diào)用返回布爾值false時(shí),die()將立即終止腳本,并馬上打印傳遞給它的字符串,“死前還能說(shuō)一兩句話”。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
PHP基于自增數(shù)據(jù)如何生成不重復(fù)的隨機(jī)數(shù)示例
這篇文章主要給大家介紹了利用PHP基于自增數(shù)據(jù)如何能生成不重復(fù)的隨機(jī)數(shù),文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05Django中的cookie與session操作實(shí)例代碼
本文通過(guò)示例代碼給大家介紹了Django中的cookie與session操作,需要的朋友參考下吧2017-08-08PHP統(tǒng)計(jì)二維數(shù)組元素個(gè)數(shù)的方法
數(shù)據(jù)表里面的字段 content 存儲(chǔ)了一個(gè)以逗號(hào)分割的字符串,最大有20個(gè)數(shù),最大數(shù)字為40。比如3,24,33,40類似字樣的數(shù)字序列。其實(shí)就是一個(gè)保存了多項(xiàng)投票結(jié)果的字段啦。現(xiàn)在需要統(tǒng)計(jì)每個(gè)數(shù)字的個(gè)數(shù),也就是每個(gè)投票項(xiàng)有多少人投了,并排序2013-11-11PHP設(shè)計(jì)模式(八)裝飾器模式Decorator實(shí)例詳解【結(jié)構(gòu)型】
這篇文章主要介紹了PHP設(shè)計(jì)模式:裝飾器模式Decorator,結(jié)合實(shí)例形式分析了PHP裝飾器模式Decorator相關(guān)概念、功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-05-05ThinkPHP5.1+Ajax實(shí)現(xiàn)的無(wú)刷新分頁(yè)功能示例
這篇文章主要介紹了ThinkPHP5.1+Ajax實(shí)現(xiàn)的無(wú)刷新分頁(yè)功能,結(jié)合實(shí)例形式詳細(xì)分析了ThinkPHP5.1+Ajax無(wú)刷新分頁(yè)具體原理、前臺(tái)數(shù)據(jù)發(fā)送與后臺(tái)處理相關(guān)操作技巧,需要的朋友可以參考下2020-02-02ThinkPHP表單自動(dòng)驗(yàn)證實(shí)例
這篇文章主要介紹了ThinkPHP表單自動(dòng)驗(yàn)證實(shí)例,是ThinkPHP三大自動(dòng)中非常常用的一個(gè)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10