當(dāng)前位置:博客首頁(yè)>>PHP >> 閱讀正文

【PHP】別名函數(shù)之die()與exit()的真正區(qū)別

作者: 鄭曉 分類: PHP 發(fā)布于: 2013-02-22 08:58 瀏覽:35,107 評(píng)論(8)


網(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)該可以確定了,只是名字不同,效果都是一樣的,沒(méi)有所謂的卸不卸載內(nèi)存的問(wèn)題。

? ? ? ?

本文采用知識(shí)共享署名-非商業(yè)性使用 3.0 中國(guó)大陸許可協(xié)議進(jìn)行許可,轉(zhuǎn)載時(shí)請(qǐng)注明出處及相應(yīng)鏈接。

本文永久鏈接: http://www.yjfs.org.cn/php-alias-die-exit-function-real-difference.html

【PHP】別名函數(shù)之die()與exit()的真正區(qū)別:目前有8 條留言

用戶評(píng)論頭像 氣派的莜面搓魚(yú)子發(fā)表于 2016年11月19日 14:46[回復(fù)]

12123213哈哈

用戶評(píng)論頭像 自豪的爆肚發(fā)表于 2016年09月05日 10:58[回復(fù)]

這個(gè)鄭大世起名是插件嗎

    用戶評(píng)論頭像 鄭曉發(fā)表于 2016年09月05日 11:00[回復(fù)]

    你應(yīng)該會(huì)發(fā)現(xiàn),這其實(shí)是一個(gè)很簡(jiǎn)單的功能,名字也很傻瓜化…是我自己寫(xiě)的。

用戶評(píng)論頭像 意志堅(jiān)強(qiáng)的餛飩發(fā)表于 2016年08月26日 10:22[回復(fù)]

die 和 exit應(yīng)該是函數(shù)吧

用戶評(píng)論頭像 嚴(yán)守時(shí)刻的豌豆包發(fā)表于 2016年08月12日 17:12[回復(fù)]

taste good
謝謝

用戶評(píng)論頭像 有理性的鏝頭發(fā)表于 2015年11月04日 16:16[回復(fù)]

很喜歡你這博客里的一些模塊的點(diǎn)子,引起我也想做個(gè)個(gè)人博客的興趣,還望多多指教,,嘻嘻

用戶評(píng)論頭像 勤勞的啄木鳥(niǎo)發(fā)表于 2015年09月01日 16:39[回復(fù)]

吃幾把

用戶評(píng)論頭像 日照婚紗照發(fā)表于 2013年02月28日 14:00[回復(fù)]

關(guān)注博主 ??

發(fā)表評(píng)論

change vcode