您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“PHP中的變量結(jié)構(gòu)體實(shí)例用法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“PHP中的變量結(jié)構(gòu)體實(shí)例用法”吧!
PHP5 中的 zval
// 1. zval typedef struct _zval_struct { zvalue_value value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc; } zval; // 2. zvalue_value typedef union _zvalue_value { long lval; // 用于 bool 類型、整型和資源類型 double dval; // 用于浮點(diǎn)類型 struct { // 用于字符串 char *val; int len; } str; HashTable *ht; // 用于數(shù)組 zend_object_value obj; // 用于對(duì)象 zend_ast *ast; // 用于常量表達(dá)式(PHP5.6 才有) } zvalue_value; // 3. zend_object_value typedef struct _zend_object_value { zend_object_handle handle; const zend_object_handlers *handlers; } zend_object_value; // 4. zend_object_handle typedef unsigned int zend_object_handle;
多數(shù)文章,在提到PHP5 變量結(jié)構(gòu)體的時(shí)候,都提到:sizeof(zval) == 24, sizeof(zvalue_value) == 16,實(shí)際上這個(gè)論述并不準(zhǔn)確,在 CPU 為 64bit 時(shí),這個(gè)結(jié)果是正確的。
但當(dāng) CPU 為32bit 時(shí): sizeof(zval) == 16, sizeof(zvalue_value) == 8,主要因?yàn)?CPU 為 64bit 時(shí),指針占用8個(gè)字節(jié),而 32bit時(shí),指針為4個(gè)字節(jié)。
PHP 7 中的 zval
// 1. zval struct _zval_struct { zend_value value; /* value */ union { struct { ZEND_ENDIAN_LOHI_4( zend_uchar type, /* active type */ zend_uchar type_flags, zend_uchar const_flags, zend_uchar reserved) /* call info for EX(This) */ } v; uint32_t type_info; } u1; union { uint32_t next; /* hash collision chain */ uint32_t cache_slot; /* literal cache slot */ uint32_t lineno; /* line number (for ast nodes) */ uint32_t num_args; /* arguments number for EX(This) */ uint32_t fe_pos; /* foreach position */ uint32_t fe_iter_idx; /* foreach iterator index */ uint32_t access_flags; /* class constant access flags */ uint32_t property_guard; /* single property guard */ } u2; }; // 2. zend_value typedef union _zend_value { zend_long lval; /* long value */ double dval; /* double value */ zend_refcounted *counted; zend_string *str; zend_array *arr; zend_object *obj; zend_resource *res; zend_reference *ref; zend_ast_ref *ast; zval *zv; void *ptr; zend_class_entry *ce; zend_function *func; struct { uint32_t w1; uint32_t w2; } ww; } zend_value;
PHP 7的看似很多,但其實(shí)更簡單了,不論 CPU 是32bit 還是 64bit,sizeof(zval) 永遠(yuǎn)都是等于 16。
主要看 zend_value 中的 ww,是兩個(gè) uint32_t,這個(gè)永遠(yuǎn)是 8 個(gè)字節(jié),所以 sizeof(zend_value) == 8,因此 sizeof(zval) == 16。
所以 PHP7 新特性提到的節(jié)省內(nèi)存這點(diǎn)上,在 32bit 系統(tǒng)中,PHP5 => PHP7 并無變化。
順便說下 sizeof,不能當(dāng)做函數(shù),雖然寫法像函數(shù),這個(gè)數(shù)值會(huì)在編譯期就確定好,非運(yùn)行期。類似編譯預(yù)處理。
到此,相信大家對(duì)“PHP中的變量結(jié)構(gòu)體實(shí)例用法”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。