前言:本來這一章是不想寫的,引文關于資料類型這章内容,大多講的都是一些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;
這個東西我也就是對着書了解了一下,深究的話,我覺得暫時用處不大,那就知道這麼個東西就行了-_-
今天就差不多寫這些吧,後面的主要是一些轉換的東西,都是設計内部運作的實作,現在看也沒多大意思,就溜了溜了 哈哈哈