<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            php語言

            PHP函數die()與exit()的真正區別

            時間:2025-03-06 12:58:53 php語言 我要投稿
            • 相關推薦

            PHP函數die()與exit()的真正區別

              網上搜索die與exit兩個函數的區別,大部分的”標準答案”都是說die是退出并釋放內存,exit是退出但不釋放內存。

              還有人說exit()并不一定就能讓程序結束,因為可以使用因為可以使用register_shutdown_function注冊一個或多個exit之后才執行的函數,并且還有對象的析構函數也會在exit之后執行。但是die()一定能結束程序。

              這個問題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 = 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的問題,我想大家應該可以確定了,只是名字不同,效果都是一樣的,沒有所謂的卸不卸載內存的問題。

            【PHP函數die()與exit()的真正區別】相關文章:

            PHP函數的區別及用法10-27

            PHP的語言結構和函數的區別09-02

            關于Linux系統命令中exit與exit的區別09-19

            PHP類與構造函數07-01

            PHP內部函數的定義07-04

            php數學常用函數10-24

            PHP常用函數總結10-21

            PHP基本函數介紹10-25

            PHP常用函數匯總09-07

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看