成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

掌握PHP7的基本變量

PHP7欄目介紹相關(guān)基本變量。

成都創(chuàng)新互聯(lián)專(zhuān)注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站制作、寶塔網(wǎng)絡(luò)推廣、成都小程序開(kāi)發(fā)、寶塔網(wǎng)絡(luò)營(yíng)銷(xiāo)、寶塔企業(yè)策劃、寶塔品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供寶塔建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:jinyejixie.com變量的基礎(chǔ)結(jié)構(gòu)

我們都知道PHP的變量是弱類(lèi)型的,聲明的時(shí)候無(wú)需指定類(lèi)型。那么這里面具體是怎么實(shí)現(xiàn)的呢?這就得從變量的基礎(chǔ)結(jié)構(gòu)說(shuō)起了。

zval的實(shí)現(xiàn)

在源碼文件 zend_type.h 中,可以看到 zval 的定義:

typedef struct _zval_struct     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 */
		uint32_t     extra;                /* not further specified */
	} u2;
}復(fù)制代碼

zval 的結(jié)構(gòu)由一個(gè)保存變量類(lèi)型的值或指針的 union 聯(lián)合體 zend_value 以及兩個(gè) union 聯(lián)合體 u1 和 u2 組成

u1

u1的作用是用來(lái)保存變量類(lèi)型及其信息,其里面的字段用處如下:

type:記錄變量類(lèi)型。 即可通過(guò) u2.v.type 來(lái)訪問(wèn)到

type_flags:對(duì)應(yīng)變量特有類(lèi)型的標(biāo)記(如常量類(lèi)型,需引用計(jì)數(shù)類(lèi)型,不可變類(lèi)型),不同類(lèi)型的變量對(duì)應(yīng)的 flag 不一樣。

const_flags:常量類(lèi)型的標(biāo)記

reserved:保留字段

u2

u2 主要是輔助作用,由于結(jié)構(gòu)體的內(nèi)存對(duì)齊,所以 u2 的的這塊空間有或者沒(méi)有 u2 都是已經(jīng)占據(jù)空間了,所以就利用起來(lái)。u2的輔助字段里面記錄了很多類(lèi)型信息,這些信息對(duì)內(nèi)部功能有很大的好處,或提升緩存友好性或減少了內(nèi)存尋址的操作。這里介紹其中部分字段。

next:用來(lái)解決哈希沖突問(wèn)題(哈希沖突這個(gè)目前還不懂),記錄沖突的下一個(gè)元素位置。

cache_slot:運(yùn)行時(shí)緩存。在執(zhí)行函數(shù)時(shí)會(huì)優(yōu)先去緩存中查找,若緩存中沒(méi)有,再去全局的 function 表中查找。

num_args:函數(shù)調(diào)用時(shí)傳入?yún)?shù)的個(gè)數(shù)

access_flags:對(duì)象類(lèi)的訪問(wèn)標(biāo)識(shí),如public protected private 這些。

zend_value
typedef union _zend_value {
	zend_long         lval;				/* 整型*/
	double            dval;				/* 浮點(diǎn)型 */
	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;復(fù)制代碼

從 zend__value 中可以看出,long、double 類(lèi)型直接存儲(chǔ)值,而其它類(lèi)型都為指針,指向各自的結(jié)構(gòu)。所以,由于 zval 這樣的結(jié)構(gòu),PHP 變量在聲明的時(shí)候不用顯示的指定其類(lèi)型,因?yàn)椴还苣阗x給變量什么類(lèi)型的值,它都能幫你找到對(duì)應(yīng)的存儲(chǔ)結(jié)構(gòu)。

以值為字符串的變量為例,其結(jié)構(gòu)是這樣的:

PHP5 與 PHP7 的 zval 結(jié)構(gòu)對(duì)比PHP5
PHP7

可以看到 php7 的 zval 總的只占 16 個(gè)字節(jié),相比 PHP5 的 zval 所占用的 48 個(gè)字節(jié)節(jié)省了很大的內(nèi)存。

此外,在 PHP5 中,所有的變量都在堆中申請(qǐng),但是對(duì)于臨時(shí)變量來(lái)說(shuō),沒(méi)有必要在堆中申請(qǐng)。所以在 PHP7 中對(duì)此做了優(yōu)化,臨時(shí)變量是直接在棧中申請(qǐng)的。

常見(jiàn)變量類(lèi)型

下面介紹幾個(gè)常見(jiàn)類(lèi)型的變量結(jié)構(gòu),其他更多的類(lèi)型,可自行查看源碼。

整型和浮點(diǎn)型

對(duì)于整型和浮點(diǎn)型,由于其占用空間小,在 zval 中是直接存儲(chǔ)的 整型的值是存在 lval 里,浮點(diǎn)型值則是存儲(chǔ)在 dval 里。

typedef union _zend_value {
    zend_long         lval;             /* 整型*/
    double            dval;             /* 浮點(diǎn)型 */
    ... 
 }復(fù)制代碼
字符串

PHP 7 中定義了新的字符串結(jié)構(gòu)體。結(jié)構(gòu)如下:

struct _zend_string {
	zend_refcounted_h ;
	zend_ulong        h;                /* hash value */
	size_t            len;	char              val[1];
};復(fù)制代碼

上面各個(gè)字段的意思:

gc: 變量引用信息,所有用到引用計(jì)數(shù)的變量類(lèi)型都會(huì)有這個(gè)結(jié)構(gòu)。

h: 哈希值,數(shù)組中計(jì)算索引時(shí)會(huì)用到。(據(jù)說(shuō)這個(gè)操作為 PHP7 提高了 5% 的性能)

len: 字符串長(zhǎng)度,通過(guò)這個(gè)值保證二進(jìn)制安全

val: 字符串內(nèi)容,變長(zhǎng)struct,分配時(shí)按len長(zhǎng)度申請(qǐng)內(nèi)存 數(shù)組

array 是 PHP 中非常強(qiáng)大的一個(gè)數(shù)據(jù)結(jié)構(gòu),它的底層實(shí)現(xiàn)就是普通的有序HashTable,這里簡(jiǎn)單看下它的結(jié)構(gòu)。后續(xù)再具體深入。

typedef struct _zend_array HashTable;struct _zend_array {
	zend_refcounted_h gc;	union {		struct {
			ZEND_ENDIAN_LOHI_4(
				zend_uchar    flags,
				zend_uchar    nApplyCount,
				zend_uchar    nIteratorsCount,
				zend_uchar    consistency)
		} v;		uint32_t flags;
	} u;	uint32_t          nTableMask;
	Bucket           *arData;	uint32_t          nNumUsed;	uint32_t          nNumOfElements;	uint32_t          nTableSize;	uint32_t          nInternalPointer;
	zend_long         nNextFreeElement;	dtor_func_t       pDestructor;
}復(fù)制代碼

###對(duì)象

PHP7 的對(duì)象結(jié)構(gòu)也是重新設(shè)計(jì)了,和 PHP5 的實(shí)現(xiàn)有了很大的不同。

struct _zend_object {
    zend_refcounted_h gc;    uint32_t          handle;
    zend_class_entry *ce; 
    const zend_object_handlers *handlers;
    HashTable        *properties; 
    zval              properties_table[1];
};復(fù)制代碼

這里介紹下其中幾個(gè)字段:

gc:gc頭部

*ce:對(duì)象對(duì)應(yīng)的 class 類(lèi)

*properties :HashTable結(jié)構(gòu),key 為對(duì)象的屬性名,value 是屬性值在properties_tables數(shù)組中的偏移量,通過(guò)偏移量在 properties_talbe 找到對(duì)應(yīng)的屬性值。

properties_talbe[1]:存儲(chǔ)對(duì)象的屬性值

免費(fèi)推薦:PHP7

網(wǎng)頁(yè)題目:掌握PHP7的基本變量
文章出自:http://jinyejixie.com/article28/chspjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)電子商務(wù)、網(wǎng)站改版云服務(wù)器、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)
古蔺县| 绥阳县| 新干县| 扬中市| 应城市| 罗源县| 罗源县| 庄河市| 合阳县| 炎陵县| 遵化市| 金川县| 茂名市| 阿巴嘎旗| 乌鲁木齐市| 昭苏县| 德庆县| 九台市| 绥德县| 普陀区| 罗平县| 略阳县| 南宫市| 古丈县| 澄江县| 隆昌县| 玉溪市| 遂溪县| 菏泽市| 江阴市| 涟水县| 临邑县| 沾化县| 伊川县| 仪征市| 佛学| 新疆| 航空| 得荣县| 贵溪市| 区。|