天天看點

【PHP7核心剖析】——資料類型

【PHP7核心剖析】——資料類型

前言:本來這一章是不想寫的,引文關于資料類型這章内容,大多講的都是一些PHP内部的處理,對于我們平時開發PHP用處不是特别大,我們也可以不用去确切的了解。然而今天的項目進度做完了,看看還有寫時間,想着也别浪費麼,那就簡單寫一些,就當是聯系一些自己寫文章的能力了吧!

正文開始:

資料類型這個東西吧,但凡是進階語言,肯定是離不開的,這樣一來,這個東西其實就是程式設計的最基礎的東西了,其實你如果懂了一們語言的資料類型後,其他的語言大同小異。

首先說一下PHP中的變量類型吧!這個東西我隐約記得我再一次的面試中有面試管問過我,那我就重點說一下

PHP的變量類型主要分為三類:标量類型,複合類型,特殊類型。

标量類型有:字元串(string),整形(int),浮點型(double),布爾型(bool)

複合類型有:數組(array),對象(object)

特殊類型有:資源(resource),NULL

嗯,到這裡基本就可以了,下面主要說了一下資料類型的内部實作。有興趣可以看哈,沒興趣可以跳過了。

然後我們再來看一下PHP對于資料類型的内部實作吧

重點說兩個概念:zval,zend_value

先看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     var_flags;
		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 */
	} u2;
};
           

zend_value是用來儲存具體的變量值,u1裡面就一個v結構體與一個32為無符号的type_info,type_info的值是一個4位元組的整型,每一個位元組對應了v結構體中的一個變量。v結構體中的type是用來辨別value的類型,type_flags是變量的記憶體管理。u2的話其實是用來湊數的,占了4個位元組,裡面存放的是一些特殊場景用的東西。先說一下為啥我剛剛說u2是用來湊數的,首先,在這個struct結構體中,value是占了8位元組,u1是占了4位元組,但是他們兩個加起來并不是12位元組的(内部怎麼回事暫時不清楚,後面有機會再研究一下),然後因為系統内部會進行位元組對齊,是以這個結構體會占用16位元組,那放着4位元組不用的話,就浪費了,是以就有了u2這個占4位元組的聯合體。

再就是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;
           

這個東西我也就是對着書了解了一下,深究的話,我覺得暫時用處不大,那就知道這麼個東西就行了-_-

今天就差不多寫這些吧,後面的主要是一些轉換的東西,都是設計内部運作的實作,現在看也沒多大意思,就溜了溜了  哈哈哈