日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

PHP內(nèi)核探索 —— 常量的實現(xiàn)

瀏覽:25日期:2022-09-16 14:31:55

常量,顧名思義是一個常態(tài)的量值。它與值只綁定一次,它的作用在于有肋于增加程序的可讀性和可靠性。 在PHP中,常量的名字是一個簡單值的標識符,在腳本執(zhí)行期間該值不能改變。 和變量一樣,常量默認為大小寫敏感,但是按照我們的習慣常量標識符總是大寫的。 常量名和其它任何 PHP 標簽遵循同樣的命名規(guī)則。合法的常量名以字母或下劃線開始,后面跟著任何字母,數(shù)字或下劃線。

在設(shè)定以后,常量的值無法更改常量名不需要開頭的美元符號 ($)作用域不影響對常量的訪問常量值只能是字符串或數(shù)字

在這一小節(jié)我們一起看下常量與我們常見的變量有啥區(qū)別,它在執(zhí)行期間的不可改變的特性是如何實現(xiàn)的以及常量的定義過程。

首先看下常量與變量的區(qū)別,常量是在變量的zval結(jié)構(gòu)的基礎(chǔ)上添加了一額外的元素。如下所示為PHP中常量的內(nèi)部結(jié)構(gòu)。

常量的內(nèi)部結(jié)構(gòu)

typedef struct _zend_constant { zval value; /* zval結(jié)構(gòu),PHP內(nèi)部變量的存儲結(jié)構(gòu),在第一小節(jié)有說明 */ int flags; /* 常量的標記如 CONST_PERSISTENT | CONST_CS */ char *name; /* 常量名稱 */ uint name_len; int module_number; /* 模塊號 */} zend_constant;

在Zend/zend_constants.h文件的33行可以看到如上所示的結(jié)構(gòu)定義。 在常量的結(jié)構(gòu)中,除了與變量一樣的zval結(jié)構(gòu),它還包括屬于常量的標記,常量名以及常量所在的模塊號。

在了解了常量的存儲結(jié)構(gòu)后,我們來看PHP常量的定義過程。一個例子。

define(’ICULTIVATOR’, ’www.icultivator.com’);

這是一個很常規(guī)的常量定義過程,它使用了PHP的內(nèi)置函數(shù)define。常量名為ICULTIVATOR,值為一個字符串,存放在zval結(jié)構(gòu)中。 從這個例子出發(fā),我們看下define定義常量的過程實現(xiàn)。

define定義常量

define是PHP的內(nèi)置函數(shù),在Zend/zend_builtin_functions.c文件中定義了此函數(shù)的實現(xiàn)。如下所示為部分源碼:

/* {{{ proto bool define(string constant_name, mixed value, boolean case_insensitive=false) Define a new constant */ZEND_FUNCTION(define){if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 'sz|b', &name,&name_len, &val, &non_cs) == FAILURE) {return;}... // 類常量定義 此處不做介紹... // 值類型判斷和處理c.value = *val;zval_copy_ctor(&c.value);if (val_free) {zval_ptr_dtor(&val_free);}c.flags = case_sensitive; /* non persistent */c.name = zend_strndup(name, name_len);c.name_len = name_len+1;c.module_number = PHP_USER_CONSTANT;if (zend_register_constant(&c TSRMLS_CC) == SUCCESS) {RETURN_TRUE;} else {RETURN_FALSE;}}/* }}} */

上面的代碼已經(jīng)對對象和類常量做了簡化處理, 其實現(xiàn)基本上是一個將傳遞的參數(shù)傳遞給新建的zend_constant結(jié)構(gòu),并將這個結(jié)構(gòu)體注冊到常量列表中的過程。 關(guān)于大小寫敏感,函數(shù)的第三個參數(shù)表示是否大小不敏感,默認為false(大小寫敏感)。這個參數(shù)最后會賦值給zend_constant結(jié)構(gòu)體的flags字段。其在函數(shù)中實現(xiàn)代碼如下:

zend_bool non_cs = 0; // 第三個參數(shù)的臨時存儲變量int case_sensitive = CONST_CS; // 是否大小寫敏感,默認為1if(non_cs) { // 輸入為真,大小寫不敏感 case_sensitive = 0;}c.flags = case_sensitive; // 賦值給結(jié)構(gòu)體字段

從上面的define函數(shù)的實現(xiàn)來看,PHP對于常量的名稱在定義時其實是沒有所謂的限制。如下所示代碼:

define(’^_^’, ’smile’);if (defined(’^_^’)) { echo ’yes’;}else{ echo ’no’;}//$var = ^_^; //語法錯誤$var = constant('^_^');

通過defined函數(shù)測試表示,‘^_^’這個常量已經(jīng)定義好,這樣的常量無法直接調(diào)用, 只能使用constant語句來使用, 否則在語法解析時會顯示錯誤。 在上面的代碼中有用到一個判斷常量是否定義的函數(shù),下面我們看看這個函數(shù)是如何實現(xiàn)的。

判斷常量是否設(shè)置

和define一樣, defined的實現(xiàn)也在Zend/zend_builtin_functions.c文件, 其實現(xiàn)是一個讀取參數(shù)變量,調(diào)用 zend_get_constant_ex函數(shù)獲取常量的值來判斷常量是否存在的過程。 而zend_get_constant_ex函數(shù)不僅包括了常規(guī)的常規(guī)的常量獲取,還包括類常量的獲取, 最后是通過zend_get_constant函數(shù)獲取常量的值。在zend_get_constant函數(shù)中,基本上是通過下面的代碼來獲取常量的值。

zend_hash_find(EG(zend_constants), name, name_len+1, (void **) &c)

除此之外,只是調(diào)用這個函數(shù)之前和之后對name有一些特殊的處理。

常量的初始化

以上通過define定義的常量的模塊編號都是PHP_USER_CONSTANT,這表示是用戶定義的常量。 除此之外我們在平時使用較多的,如在顯示所有級別錯誤報告時使用的E_ALL常量就有點不同了。 這里我們以cgi模式為例說明標準常量的定義過程。 整個調(diào)用順序如下所示:

[php_cgi_startup() -> php_module_startup() -> zend_startup() -> zend_register_standard_constants()]

void zend_register_standard_constants(TSRMLS_D){ ... // 若干常量以REGISTER_MAIN_LONG_CONSTANT設(shè)置, REGISTER_MAIN_LONG_CONSTANT('E_ALL', E_ALL, CONST_PERSISTENT | CONST_CS); ...}

REGISTER_MAIN_LONG_CONSTANT宏展開是以zend_register_long_constant實現(xiàn)。 zend_register_long_constant函數(shù)將常量中值的類型,值,名稱及模塊號賦值給新的zend_constant。 并調(diào)用zend_register_constant添加到全局的常量列表中。

[php_cgi_startup() -> php_module_startup() -> zend_startup() -> zend_register_standard_constants() -> zend_register_constant]

ZEND_API void zend_register_long_constant(const char *name, uint name_len,long lval, int flags, int module_number TSRMLS_DC){ zend_constant c; c.value.type = IS_LONG; c.value.value.lval = lval; c.flags = flags; c.name = zend_strndup(name, name_len-1); c.name_len = name_len; c.module_number = module_number; zend_register_constant(&c TSRMLS_CC);}

zend_register_constant函數(shù)首先根據(jù)常量中的c->flags判斷是否區(qū)分大小寫, 如果不區(qū)分,則名字統(tǒng)一為小寫,如果包含'',也統(tǒng)一成小寫。否則為定義的名字 然后將調(diào)用下面的語句將當前常量添加到EG(zend_constants)。 EG(zend_constants)是一個HashTable(這在前面的章節(jié)中說明), 下面的代碼是將常量添加到這個HashTable中。

zend_hash_add(EG(zend_constants), name, c->name_len, (void *) c,sizeof(zend_constant), NULL)==FAILURE)

在php_module_startup函數(shù)中,除了zend_startup函數(shù)中有注冊標準的常量, 它本身體通過宏REGISTER_MAIN_LONG_CONSTANT等注冊了一些常量,如:PHP_VERSION,PHP_OS等。

標簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品免费观看视频| 亚洲成av人片一区二区密柚| 免费在线观看一区| 亚洲精品乱码| 天堂av一区| 亚洲最新av| 国产亚洲网站| 亚洲神马久久| 日本在线一区二区三区| 日韩美女精品| 久久精品xxxxx| 卡一卡二国产精品| 午夜影院一区| 影音先锋久久| 亚洲精品乱码| 国产丝袜一区| 欧美xxxx中国| 韩日一区二区三区| 日韩一区欧美二区| 日本va欧美va欧美va精品| 国产欧美精品| 国产一区二区三区国产精品| 麻豆精品在线观看| 91精品一区国产高清在线gif | 91视频一区| 极品日韩av| 午夜久久av| 麻豆理论在线观看| 亚洲综合日本| 里番精品3d一二三区| 美女网站一区| 国产精选久久| 国产一区日韩欧美| 亚洲精品在线国产| 国产精品成人国产| 日韩免费看片| 国产精品伊人| 午夜日本精品| 欧美激情日韩| 中文字幕视频精品一区二区三区| 国产精品s色| 久久亚洲影院| 国产一区二区三区不卡av| 亚洲欧美日韩国产一区二区| 精品黄色一级片| 日本一区中文字幕| 日韩视频在线一区二区三区| 精品视频91| 日韩1区2区日韩1区2区| 国产高潮在线| 国产精品麻豆成人av电影艾秋 | 欧美sss在线视频| 久久久久伊人| 国产精品午夜一区二区三区| 欧洲毛片在线视频免费观看| 精品久久在线| 国产情侣久久| 四虎精品永久免费| 99国产一区| 欧美成人亚洲| 九一国产精品| 国产精品蜜芽在线观看| 亚洲精品进入| 另类av一区二区| 国产亚洲精品v| 亚洲免费一区二区| 国产一区成人| 亚洲在线电影| 免费精品视频最新在线| 91精品福利| 1024精品久久久久久久久| 久久影院一区| 午夜国产一区二区| 99香蕉国产精品偷在线观看| 亚洲网站视频| 午夜在线视频一区二区区别| 成人免费电影网址| 亚洲综合电影| 亚洲精品一区二区在线看| 激情丁香综合| 亚洲日本三级| 国产日韩免费| 国产精品xx| 国产精品7m凸凹视频分类| 午夜在线播放视频欧美| 四虎精品永久免费| 国产一区二区亚洲| 99久久www免费| 亚洲精品进入| 吉吉日韩欧美| 亚洲视频电影在线| 国产精品久久久久久久久久妞妞 | 亚洲制服欧美另类| 国产日韩欧美一区二区三区在线观看 | 日韩大片在线观看| 岛国av免费在线观看| 在线看片不卡| 奇米亚洲欧美| 欧美激情 亚洲a∨综合| 精品捆绑调教一区二区三区| 噜噜噜躁狠狠躁狠狠精品视频 | 欧美~级网站不卡| 亚洲人亚洲人色久| 97精品一区| 欧美亚洲精品在线| 亚洲精品日本| 999国产精品永久免费视频app| 亚洲一区激情| 国产一区二区三区亚洲综合| 免费污视频在线一区| 日韩精品久久久久久久软件91| 狠狠久久伊人| 日韩国产91| 欧美精品自拍| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 蜜臀久久精品| 亚洲18在线| 免费久久99精品国产自在现线| 久久激情五月婷婷| 亚洲一卡久久| 亚洲播播91| 美日韩一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 日韩影院精彩在线| 伊人成人在线视频| 亚洲一级二级| 国产一区二区精品久| 国产精品中文字幕亚洲欧美| 日韩免费精品| 日本综合视频| 少妇精品在线| 久久国产精品99国产| 蜜臀久久99精品久久一区二区| 国产欧美一区二区三区米奇| 免费精品视频最新在线| 亚洲精品中文字幕乱码| 亚洲成人二区| 久久人人99| 亚洲专区一区| 日韩在线卡一卡二| 日韩一区中文| 亚洲香蕉久久| 一二三区精品| 日韩**一区毛片| 国产三级一区| 欧美一区免费| 欧美国产精品| 国产激情综合| 青草国产精品久久久久久| 国产精品丝袜xxxxxxx| 免费日韩一区二区| 综合激情网...| 欧美国产亚洲精品| 国产成人精品一区二区三区免费| 91麻豆精品激情在线观看最新 | 欧美日韩中文一区二区| 中文av在线全新| 精品国产免费人成网站| 久久精品青草| 99国产精品99久久久久久粉嫩| 国产精品日本欧美一区二区三区| 日韩精品水蜜桃| 美女日韩在线中文字幕| 亚洲色图综合| 精品三级av| 亚州av乱码久久精品蜜桃| 日韩欧美精品一区二区综合视频| 日本va欧美va瓶| 黑森林国产精品av| 97精品国产福利一区二区三区| 麻豆国产在线| 蜜桃伊人久久| 国产欧美一区二区三区精品观看| 电影91久久久| 蜜臀久久久99精品久久久久久| 欧美亚洲二区| 极品日韩av| 日韩av一级片| 极品日韩av| 麻豆久久一区| 亚洲精品动态| 国精品一区二区| 国产精品亚洲综合色区韩国| 图片区亚洲欧美小说区| 国产精品xxx在线观看| 蜜臀国产一区二区三区在线播放| 亚洲精品2区| 日韩不卡免费高清视频| 精品一区二区三区中文字幕| 亚洲一区亚洲| 精品捆绑调教一区二区三区| 日本成人手机在线| 欧美日韩国产传媒| 亚洲免费福利| 狠狠久久伊人| 精品视频国产| 天堂中文在线播放| 91国语精品自产拍| 综合欧美亚洲| 日韩午夜视频在线|