1. 程式人生 > >php 常量-魔術常量

php 常量-魔術常量

__line__ php內核 lang 代碼 完整 詞法解析 body 隨著 ner

PHP中有七個魔術常量,他們的值其實是變化的,它們的值隨著它們在代碼中的位置改變而改變。所以稱他們為魔術常量。例如 __LINE__ 的值就依賴於它在腳本中所處的行來決定。這些特殊的常量不區分大小寫。在手冊中這幾個變量的簡單說明如下:

名稱說明
__LINE__ 文件中的當前行號
__FILE__ 文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。自 PHP 4.0.2 起,FILE 總是包含一個絕對路徑(如果是符號連接,則是解析後的絕對路徑),而在此之前的版本有時會包含一個相對路徑。
__DIR__ 文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄。它等價於 dirname(FILE
)。除非是根目錄,否則 目錄中名不包括末尾的斜杠。(PHP 5.3.0中新增)
__FUNCTION__ 函數名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫> 字母的
__CLASS__ 類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的
__METHOD__ 類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
__NAMESPACE__ 當前命名空間的名稱(大小寫敏感)。這個常量是在編譯時定義的(PHP 5.3.0 新增)

PHP中的一些比較魔術的變量或者標示都習慣使用下劃線來進行區分, 所以在編寫PHP代碼時也盡量不要定義雙下線開頭的常量。

PHP內核會在詞法解析時將這些常量的內容賦值進行替換,而不是在運行時進行分析,以__FUNCTION__為例,在Zend/zend_language_scanner.l文件中,__FUNCTION__是一個需要分析的元標記(token):

1 <ST_IN_SCRIPTING>"__FUNCTION__" {    char *func_name = NULL; 
2     if (CG(active_op_array)) {
3         func_name = CG(active_op_array)->function_name;    } 
4 if (!func_name) { func_name = ""; } 5 zendlval->value.str.len = strlen(func_name); 6 zendlval->value.str.val = estrndup(func_name, zendlval->value.str.len); 7 zendlval->type = IS_STRING; return T_FUNC_C;}

就是這裏,當當前中間代碼處於一個函數中時,則將當前函數名賦值給zendlval(也就是token T_FUNC_C的值內容),如果沒有,則將空字符串賦值給zendlval(因此在頂級作用域名中直接打印__FUNCTION__會輸出空格)。這個值在語法解析時會直接賦值給返回值。這樣我們就在生成的中間代碼中看到了這些常量的位置都已經賦值好了。

這些常量其實相當於一個常量模板,或者說是一個占位符,在詞法解析時這些模板或占位符就被替換成實際的值

詳細信息,可以看tipi

php 常量-魔術常量