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

網上搜索die與exit兩個函數的區別,大部分的」標準答案」都是說die是退出並釋放內存,exit是退出但不釋放內存。
這個解釋顯然是錯的,PHP手冊中已經說過「die — Equivalent to exit().This language construct is equivalent to exit(). 」二者只是別名關係,除此以外徹底同樣。
不過我仍是很好奇,決定從源碼中找找線索,看看php是如何處理的這個「別名」。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。ui

上面大概解釋了php的編譯和執行的過程,以及語言結構的定義。下面進入正題。code

咱們也應該記得,php中有不少別名函數,好比:implode和join。不管是別名函數仍是別名語言結構,從實際效果角度講,都是同樣的,不過源碼的處理方式確定仍是不同的。token

咱們先看看這個別名語言結構是如何處理的,稍後再看別名函數。內存

zend_language_parser.c中,定義了一個宏
#define T_EXIT 300get

還定義了一個enum,裏面也有
enum yytokentype {

T_EXIT = 300,
….
}編譯器

這裏告訴咱們,T_EXIT這個token,它的code是300。
再看zend_language_scanner.l,其中有這麼幾行代碼。源碼

<ST_IN_SCRIPTING>」exit」 {
return T_EXIT;
}it

<ST_IN_SCRIPTING>」die」 {
return T_EXIT;
}

很明顯,php作詞法分析時,不管遇到exit仍是die,都會返回T_EXIT這個token。從這裏酒能夠證實,die和exit,再php內部處理是徹底同樣的。

也能夠用下列php代碼來肯定:
<?php
var_dump(token_get_all(「<?php die;exit;?>」));

返回的結果中die和exit對應的token code,都是300。

如今關於die和exit的問題,我想你們應該能夠肯定了,只是名字不一樣,效果都是同樣的,沒有所謂的卸不卸載內存的問題。

相關文章
相關標籤/搜索