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

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

PHP內(nèi)核探索 —— 變量的值操作:三個(gè)基礎(chǔ)宏方便對(duì)變量的值進(jìn)行操作

瀏覽:2日期:2022-09-16 14:37:56

PHP內(nèi)核提供了三個(gè)基礎(chǔ)宏來方便我們對(duì)變量的值進(jìn)行操作,這幾個(gè)宏同樣以Z_開頭,并且P結(jié)尾和PP結(jié)尾的同上一節(jié)中的宏一樣,分別代表這參數(shù)是指針還是指針的指針。此外,為了進(jìn)一步方便我們的工作,內(nèi)核中針對(duì)具體的數(shù)據(jù)類型分別定義了相應(yīng)的宏。如針對(duì)IS_BOOL型的BVAL組合(Z_BVAL、Z_BVAL_P、Z_BVAL_PP)和針對(duì)IS_DOUBLE的DVAL組合(Z_DVAL、ZDVAL_P、ZDVAL_PP)等等。我們通過下面這個(gè)例子來應(yīng)用一下這幾個(gè)宏:

void display_value(zval zv,zval *zv_p,zval **zv_pp){if( Z_TYPE(zv) == IS_NULL ){php_printf('類型是 IS_NULL!n');}if( Z_TYPE_P(zv_p) == IS_LONG ){php_printf('類型是 IS_LONG,值是:%ld' , Z_LVAL_P(zv_p));}if(Z_TYPE_PP(zv_pp) == IS_DOUBLE ){php_printf('類型是 IS_DOUBLE,值是:%f' , Z_DVAL_PP(zv_pp) );}}

String型變量比較特殊,因?yàn)閮?nèi)核在保存String型變量時(shí),不僅保存了字符串的值,還保存了它的長(zhǎng)度,所以它有對(duì)應(yīng)的兩種宏組合STRVAL和STRLEN,即:Z_STRVAL、Z_STRVAL_P、Z_STRVAL_PP與Z_STRLEN、Z_STRLEN_P、Z_STRLEN_PP。前一種宏返回的是char *型,即字符串的地址;后一種返回的是int型,即字符串的長(zhǎng)度。

void display_string(zval *zstr){ if (Z_TYPE_P(zstr) != IS_STRING) {php_printf('這個(gè)變量不是字符串!n');return; } PHPWRITE(Z_STRVAL_P(zstr), Z_STRLEN_P(zstr)); //這里用了PHPWRITE宏,只要知道它是從Z_STRVAL_P(zstr)地址開始,輸出Z_STRLEN_P(zstr)長(zhǎng)度的字符就可以了。}

Array型變量的值其實(shí)是存儲(chǔ)在C語言實(shí)現(xiàn)的HashTable中的,我們可以用ARRVAL組合宏(Z_ARRVAL, Z_ARRVAL_P, Z_ARRVAL_PP)這三個(gè)宏來訪問數(shù)組的值。如果你看舊版本php的源碼或者部分pecl擴(kuò)展的源碼,可能會(huì)發(fā)現(xiàn)一個(gè)HASH_OF()宏,這個(gè)宏等價(jià)于Z_ARRVAL_P(),但不推薦在新代碼中再使用了。

對(duì)象是一個(gè)復(fù)雜的結(jié)構(gòu)體(zend_object_value結(jié)構(gòu)體),不僅存儲(chǔ)屬性的定義、屬性的值,還存儲(chǔ)著訪問權(quán)限、方法等信息。內(nèi)核中定義了以下組合宏讓我們方便的操作對(duì)象:OBJ_HANDLE, which returns the handle identifier, OBJ_HT for the handler table, OBJCE for the class definition, OBJPROP for the property HashTable, and OBJ_HANDLER for manipulating a specific handler method in the OBJ_HT table. Don’t worry about the meaning of these various object macros just yet; they’ll be covered in detail in Chapter 10, 'PHP4 Objects,' and Chapter 11, 'PHP5 Objects.'

資源型變量的值其實(shí)就是一個(gè)整數(shù),可以用RESVAL組合宏來訪問它,我們把它的值傳給zend_fetch_resource函數(shù),便可以得到這個(gè)資源的操作句柄,如mysql的鏈接句柄等。有關(guān)資源的內(nèi)容我們將在第9章展開敘述。

有關(guān)值操作的宏都定義在./Zend/zend_operators.h文件里:

//操作整數(shù)的#define Z_LVAL(zval)(zval).value.lval#define Z_LVAL_P(zval_p)Z_LVAL(*zval_p)#define Z_LVAL_PP(zval_pp)Z_LVAL(**zval_pp)//操作IS_BOOL布爾型的#define Z_BVAL(zval)((zend_bool)(zval).value.lval)#define Z_BVAL_P(zval_p)Z_BVAL(*zval_p)#define Z_BVAL_PP(zval_pp)Z_BVAL(**zval_pp)//操作浮點(diǎn)數(shù)的#define Z_DVAL(zval)(zval).value.dval#define Z_DVAL_P(zval_p)Z_DVAL(*zval_p)#define Z_DVAL_PP(zval_pp)Z_DVAL(**zval_pp)//操作字符串的值和長(zhǎng)度的#define Z_STRVAL(zval)(zval).value.str.val#define Z_STRVAL_P(zval_p)Z_STRVAL(*zval_p)#define Z_STRVAL_PP(zval_pp)Z_STRVAL(**zval_pp)#define Z_STRLEN(zval)(zval).value.str.len#define Z_STRLEN_P(zval_p)Z_STRLEN(*zval_p)#define Z_STRLEN_PP(zval_pp)Z_STRLEN(**zval_pp)//操作數(shù)組的#define Z_ARRVAL(zval)(zval).value.ht#define Z_ARRVAL_P(zval_p)Z_ARRVAL(*zval_p)#define Z_ARRVAL_PP(zval_pp)Z_ARRVAL(**zval_pp)//操作對(duì)象的#define Z_OBJVAL(zval)(zval).value.obj#define Z_OBJVAL_P(zval_p)Z_OBJVAL(*zval_p)#define Z_OBJVAL_PP(zval_pp)Z_OBJVAL(**zval_pp)#define Z_OBJ_HANDLE(zval)Z_OBJVAL(zval).handle#define Z_OBJ_HANDLE_P(zval_p)Z_OBJ_HANDLE(*zval_p)#define Z_OBJ_HANDLE_PP(zval_p)Z_OBJ_HANDLE(**zval_p)#define Z_OBJ_HT(zval)Z_OBJVAL(zval).handlers#define Z_OBJ_HT_P(zval_p)Z_OBJ_HT(*zval_p)#define Z_OBJ_HT_PP(zval_p)Z_OBJ_HT(**zval_p)#define Z_OBJCE(zval)zend_get_class_entry(&(zval) TSRMLS_CC)#define Z_OBJCE_P(zval_p)Z_OBJCE(*zval_p)#define Z_OBJCE_PP(zval_pp)Z_OBJCE(**zval_pp)#define Z_OBJPROP(zval)Z_OBJ_HT((zval))->get_properties(&(zval) TSRMLS_CC)#define Z_OBJPROP_P(zval_p)Z_OBJPROP(*zval_p)#define Z_OBJPROP_PP(zval_pp)Z_OBJPROP(**zval_pp)#define Z_OBJ_HANDLER(zval, hf) Z_OBJ_HT((zval))->hf#define Z_OBJ_HANDLER_P(zval_p, h)Z_OBJ_HANDLER(*zval_p, h)#define Z_OBJ_HANDLER_PP(zval_p, h)Z_OBJ_HANDLER(**zval_p, h)#define Z_OBJDEBUG(zval,is_tmp)(Z_OBJ_HANDLER((zval),get_debug_info)?Z_OBJ_HANDLER((zval),get_debug_info)(&(zval),&is_tmp TSRMLS_CC): (is_tmp=0,Z_OBJ_HANDLER((zval),get_properties)?Z_OBJPROP(zval):NULL)) #define Z_OBJDEBUG_P(zval_p,is_tmp)Z_OBJDEBUG(*zval_p,is_tmp) #define Z_OBJDEBUG_PP(zval_pp,is_tmp)Z_OBJDEBUG(**zval_pp,is_tmp)//操作資源的#define Z_RESVAL(zval)(zval).value.lval#define Z_RESVAL_P(zval_p)Z_RESVAL(*zval_p)#define Z_RESVAL_PP(zval_pp)Z_RESVAL(**zval_pp)

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 提升海外网站流量,增加国外网站访客UV,定制海外IP-访客王 | 康明斯发电机,上柴柴油发电机,玉柴柴油发电机组_海南重康电力官网 | 好物生环保网、环保论坛 - 环保人的学习交流平台 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 5nd音乐网|最新流行歌曲|MP3歌曲免费下载|好听的歌|音乐下载 免费听mp3音乐 | 骁龙云呼电销防封号系统-axb电销平台-外呼稳定『免费试用』 | 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 交通信号灯生产厂家_红绿灯厂家_电子警察监控杆_标志杆厂家-沃霖电子科技 | 恒温槽_恒温水槽_恒温水浴槽-上海方瑞仪器有限公司 | 脑钠肽-白介素4|白介素8试剂盒-研域(上海)化学试剂有限公司 | 列管冷凝器,刮板蒸发器,外盘管反应釜厂家-无锡曼旺化工设备有限公司 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 生鲜配送系统-蔬菜食材配送管理系统-连锁餐饮订货配送软件-挪挪生鲜供应链管理软件 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 广东青藤环境科技有限公司-水质检测 | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 扒渣机,铁水扒渣机,钢水扒渣机,铁水捞渣机,钢水捞渣机-烟台盛利达工程技术有限公司 | 煤机配件厂家_刮板机配件_链轮轴组_河南双志机械设备有限公司 | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 字典-新华字典-在线字典查字-字典趣 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 耐火浇注料-喷涂料-浇注料生产厂家_郑州市元领耐火材料有限公司 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 蒸汽吸附分析仪-进口水分活度仪|康宝百科 | 能量回馈_制动单元_电梯节能_能耗制动_深圳市合兴加能科技有限公司 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 脱硝喷枪-氨水喷枪-尿素喷枪-河北思凯淋环保科技有限公司 |