国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

PHP內核探索 —— 變量的值操作:三個基礎宏方便對變量的值進行操作

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

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

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型變量比較特殊,因為內核在保存String型變量時,不僅保存了字符串的值,還保存了它的長度,所以它有對應的兩種宏組合STRVAL和STRLEN,即:Z_STRVAL、Z_STRVAL_P、Z_STRVAL_PP與Z_STRLEN、Z_STRLEN_P、Z_STRLEN_PP。前一種宏返回的是char *型,即字符串的地址;后一種返回的是int型,即字符串的長度。

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

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

對象是一個復雜的結構體(zend_object_value結構體),不僅存儲屬性的定義、屬性的值,還存儲著訪問權限、方法等信息。內核中定義了以下組合宏讓我們方便的操作對象: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.'

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

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

//操作整數的#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)//操作浮點數的#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)//操作字符串的值和長度的#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)//操作數組的#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)//操作對象的#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)

標簽: PHP
相關文章:
主站蜘蛛池模板: 美国一级做a一级视频 | 综合久久久久久 | 88av视频在线 | 在线免费看黄色 | 欧美激情伦妇在线观看 | 婷婷色综合久久五月亚洲 | 日韩欧美亚洲国产 | 一级做a爱片特黄在线观看免费看 | 国产视频中文字幕 | www看片| 午夜三级国产精品理论三级 | 黑人巨大videos极度另类 | 日本一级毛片高清免费观看视频 | 精品国产欧美一区二区五十路 | 久久精品在线视频 | 国产成人小视频在线观看 | 九九干 | 亚洲男人天堂2018 | 91热国内精品永久免费观看 | 欧美成人影院免费观 | 亚欧成人毛片一区二区三区四区 | 欧美精品一区视频 | 亚洲国产日产韩国欧美综合 | 日韩在线二区 | 国产精品久久久久影院色老大 | 成人免费手机在线看网站 | 免费一级毛片私人影院a行 免费一级毛片无毒不卡 | 国产国产人免费视频成69堂 | 国产精品一区二区在线观看 | 国产精品免费一区二区三区四区 | 日本特黄a级高清免费酷网 日本特黄特色 | 久久国产午夜精品理论片34页 | 激情视频一区 | 欧美成人三级大全 | 国产精品高清视亚洲精品 | 成人a免费视频播放 | 夜色福利久久久久久777777 | 亚洲一级毛片欧美一级说乱 | 在线免费观看亚洲视频 | 成人网18免费网站在线 | 蝴蝶成人世界第八影院 |