【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;

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章