程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 關於php中的別名

關於php中的別名

編輯:PHP綜合

PHP中exit和die有什麼區別?

兩個有區別,die是退出並釋放內存,exit是退出但不釋放內存。

這個解釋顯然是錯的,我們以前都看過手冊中說,兩者只是別名關系,除此之外完全一樣。

不過我還是很好奇,決定從源碼中找找線索,看看php是如何處理的這個“別名”。

首先要清楚一點,die和exit都是語言結構而非函數。很多初學者總搞不清語言結構和函數的區別,用通俗點的話講,語言結構可以理解為語法本身的一種標識。像+、-、*、/這些也都是語言結構,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,其中有這麼幾行代碼。

<ST_IN_SCRIPTING>"exit" {

return T_EXIT;

}

<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。

查看本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved