电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

PHP內核探索 —— 變量的存儲

瀏覽:11日期:2022-09-16 14:33:45

PHP中的變量類型和值是通過C語言實現的,內核具體是如何組織用戶在PHP中定義的變量呢?

HashTable在ZE內核中被廣泛使用,PHP變量也正是存儲在一個HashTable實現的符號表里。當在PHP中調用一個函數或者類時,內核會創建一個新的符號表,這也是為什么在函數中無法使用函數外部定義的變量的原因。因為他們分屬兩個符號表,一個當前作用域,一個全局作用域。

現在來看內核中是如何定義作用域的:

struct _zend_executor_globals { //略 HashTable symbol_table;//全局變量的符號表 HashTable *active_symbol_table;//局部變量的符號表 //略 };

可以通過EG宏來訪問變量符號表,EG(symbol_table)訪問全局作用域的變量符號表,EG(active_symbol_table)訪問當前作用域的變量符號表。

<?php $foo=’bar’; ?>

上面這段代碼很簡單,創建變量foo,并賦值bar。之后的PHP代碼中就可以調用$foo變量了。現在看看PHP中定義的變量,內核中是如何實現的。偽代碼:

zval* foo; MAKE_STD_ZVAL(foo); ZVAL_STRING(foo, 'bar', 1); ZEND_SET_SYMBOL( EG(active_symbol_table), 'foo', foo);第一步:創建一個zval結構,并設置類型。第二步:賦值為bar。第三步:將其加入當前作用域符號表,只有這樣用戶才能在PHP里使用這個變量。

通過簡單的這三步,即可實現定義PHP變量。簡單的原因,在于內核為我們提供了強大的宏。現在我們將宏分別展開。

MAKE_STD_ZVAL應用到的宏有:

#define MAKE_STD_ZVAL(zv) ALLOC_ZVAL(zv);INIT_PZVAL(zv) #define ALLOC_ZVAL(z) ZEND_FAST_ALLOC(z, zval, ZVAL_CACHE_LIST) #define ZEND_FAST_ALLOC(p, type, fc_type) (p) = (type *) emalloc(sizeof(type)) #define INIT_PZVAL(z) (z)->refcount__gc = 1;(z)->is_ref__gc = 0;

MAKE_STD_ZVAL(foo)展開后得到:

(foo) = (zval *) emalloc(sizeof(zval)); (foo)->refcount__gc = 1; (foo)->is_ref__gc = 0;

可以看出,MAKE_STD_ZVAL做了三件事:分配內存、初始化zval結構中的refcount、is_ref。

ZVAL_STRING應用到的宏有:

#define ZVAL_STRING(z, s, duplicate) { const char *__s=(s); Z_STRLEN_P(z) = strlen(__s); Z_STRVAL_P(z) = (duplicate?estrndup(__s, Z_STRLEN_P(z)):(char*)__s); Z_TYPE_P(z) = IS_STRING; } #define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p) #define Z_STRLEN(zval) (zval).value.str.len #define Z_STRVAL_P(zval_p) Z_STRVAL(*zval_p) #define Z_STRVAL(zval) (zval).value.str.val #define Z_TYPE_P(zval_p) Z_TYPE(*zval_p) #define Z_TYPE(zval) (zval).type #define IS_STRING 6

展開后得到:

const char *__s=('foo'); (foo).value.str.len=strlen(__s); (foo).value.str.val=(duplicate?estrndup(__s, (zval).value.str.len):(char*)__s); (foo).type=6;

ZVAL_STRING做的工作是設置數據類型并賦值。

ZEND_SET_SYMBOL這里只展開一部分宏,因為它展開后過于復雜。

# define EG(v) (executor_globals.v)

展開部分后得到:

ZEND_SET_SYMBOL(executor_globals.active_symbol_table, 'foo', foo);

將變量名入當前作用域符號表。之所以使用內核提供的宏來分配內存、注冊變量作用域,是因為這樣能提高兼容性。

標簽: PHP
相關文章:
主站蜘蛛池模板: 517瓜水果特产网|一个专注特产好物的网站 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | 原色会计-合肥注册公司_合肥代理记账公司_营业执照代办 | 辊道窑炉,辊道窑炉厂家-山东艾希尔| 一体化预制泵站-一体化提升泵站-一体化泵站厂家-山东康威环保 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 365文案网_全网创意文案句子素材站 | 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | MVE振动电机_MVE震动电机_MVE卧式振打电机-河南新乡德诚生产厂家 | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 聚丙烯酰胺_阴离子_阳离子「用量少」巩义亿腾厂家直销,售后无忧 聚合甘油__盐城市飞龙油脂有限公司 | 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 电动液压篮球架_圆管地埋式篮球架_移动平箱篮球架-强森体育 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 污水提升器,污水提升泵,污水提升装置-德国泽德(zehnder)水泵系统有限公司 | 立式矫直机_卧式矫直机-无锡金矫机械制造有限公司 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 滑板场地施工_极限运动场地设计_滑板公园建造_盐城天人极限运动场地建设有限公司 | 小学教案模板_中学教师优秀教案_高中教学设计模板_教育巴巴 | 深圳希玛林顺潮眼科医院(官网)│深圳眼科医院│医保定点│香港希玛林顺潮眼科中心连锁品牌 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | POS机办理_个人pos机免费领取-银联pos机申请首页 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 北京软件开发_软件开发公司_北京软件公司-北京宜天信达软件开发公司 | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 不锈钢酒柜|恒温酒柜|酒柜定制|酒窖定制-上海啸瑞实业有限公司 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 | 杭州公司变更法人-代理记账收费价格-公司注销代办_杭州福道财务管理咨询有限公司 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 |