別名函式之die 與exit 的真正區別

2021-07-06 05:01:11 字數 1375 閱讀 6361

網上搜尋die與exit兩個函式的區別,大部分的」標準答案」都是說die是退出並釋放記憶體,exit是退出但不釋放記憶體。

這個解釋顯然是錯的,php手冊中已經說過「die — equivalent to exit().this 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這個token,它的code是300。

再看zend_language_scanner.l,其中有這麼幾行**。

」exit」

」die」

很明顯,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的問題,我想大家應該可以確定了,只是名字不同,效果都是一樣的,沒有所謂的卸不解除安裝記憶體的問題。

die 與exit 的區別

die 與exit php手冊 die equivalent to exit 其實exit和die這兩個名字指向的是同乙個函式,die 是exit 函式的別名。該函式只接受乙個引數,可以是乙個程式返回的數值或是乙個字串,也可以不輸入引數,結果沒有返回值。雖然兩者相同,但通常使用中也有細微的選擇性 當...

PHP中die 與exit 的區別

die 與exit php手冊 die equivalent to exit 說明 die 和exit 都是中止指令碼執行函式 其實exit和die這兩個名字指向的是同乙個函式,die 是exit 函式的別名。該函式只接受乙個引數,可以是乙個程式返回的數值或是乙個字串,也可以不輸入引數,結果沒有返回...

PHP中die 與exit 的區別

die 與exit php手冊 die equivalent to exit 說明 die 和exit 都是中止指令碼執行函式 其實exit和die這兩個名字指向的是同乙個函式,die 是exit 函式的別名。該函式只接受乙個引數,可以是乙個程式返回的數值或是乙個字串,也可以不輸入引數,結果沒有返回...