深入理解PHP核心(五)變數及資料類型-變數的結構和類型,深入理解核心
原文連結:http://www.orlion.ga/238/
程式設計語言的類型可以分為強型別和弱類型兩種,PHP是弱類型語言,但是C語言是強型別語言。在官網PHP實現內部,所有變數使用同一種資料結構(zval)來儲存,這個結構表示PHP中的各種資料類型,它不僅包含變數的值,也包含變數的類型。這就是PHP弱類型的核心。
那zval結構是如何?弱類型的呢?
一、PHP變數類型及儲存結構
PHP在聲明和使用變數的時候,並不需要指明其資料類型,PHP是弱類型語言,但是PHP有類型,PHP有八中資料類型,可以分成三類:標量類型:boolean、integer、float(double) string;複合類型:array、object;特殊類型:resource、NULL
C語言是如何?PHP中的弱類型的呢?
1、變數儲存結構
變數的值儲存到如下所示的zval結構體中,zval結構體定義在Zend/zend.h檔案,其結構如下:
typedef struct _zval_struct zval;...struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc;};
zval結構體中有四個欄位,其含義分別為:
| 屬性名稱 |
含義 |
預設值 |
| refcount_gc |
表示引用計數 |
1 |
| is_ref_gc |
表示是否為引用 |
0 |
| value |
儲存變數的值 |
|
| type |
變數具體的類型 |
|
在PHP5.3之後,引入了新的記憶體回收機制,引用計數和引用的欄位名改為refcout_gc和is_ref_gc在此之前為refcount和is_ref.
變數的值儲存在另外一個結構體zvalue_value,值儲存見下面的介紹。
2、變數類型
zval結構體的type欄位就是實現弱類型最關鍵的欄位了,type的值可以為:IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_OBJECT和IS_RESOURCE之一。除此之外和它們定義在一起的類型還有IS_CONSTANT、IS_CONSTANT_ARRAY。
二、變數的值儲存
前面提到變數的值儲存在zvalue_value聯合體中,結構體定義如下:
typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj;} zvalue_value;
各種類型的資料會使用不同的方法來進行變數值的儲存,其對應賦值方式如下:
一般類型:
| 變數類型 |
宏 |
|
| boolean |
ZVAL_BOOL |
布爾型/整型的變數值儲存於(zval).value.lval中,其類型也會 以相應的IS_*進行儲存 |
| integer |
ZVAL_LONG |
| float |
ZVAL_DOUBLE |
Z_TYPE_P(z)=IS_BOOL/LONG;Z_LVAL_P(z)=(b)!=0; |
| null |
ZVAL_NULL |
NULL值的變數值不需要儲存,只需要把(zval).type標為IS_NUL Z_TYPE_P(z)=IS_NULL; |
| resource |
ZVAL_RESOURCE |
資源類型的儲存與其他一般變數無異,但其初始化及儲存實現則不 同Z_TYPE_P(z) = IS_RESOURCE; Z_LVAL_P(z) = 1; |
字串
字串的類型標示和其他資料類型一樣,不過在儲存字串時多了一個字串長度的欄位。
struct { char *val; int len;} str;
(儲存字串長度是因為字串的操作十分頻繁,有利於節省時間,是空間換時間的做法)
數組Array
數組是PHP中最常用也是最強大變數類型。數組的值儲存在zvalue_value.ht欄位中,它是一個HashTable類型的資料。PHP數組使用雜湊表來儲存關聯資料。PHP的雜湊表實現中使用了兩個資料結構HashTable和Bucket。PHP所有的工作都是由雜湊表實現。
對象Object
PHP的對象是一種複合型的資料,使用一種zend_object_value的結構體來存放,其定義如下
typedef struct _zend_object_value { zend_object_handle handle; // unsigned int類型,EG(objects_store).object_buckets的索引 zend_object_handlers *handlers;} zend_object_value;
PHP的對象只有在運行時才會被建立,前面介紹了EG宏,這是一個全域結構體由於儲存在運行時的資料。其中就包括了用來儲存所有被建立的對象的對象池,EG(objects_store),而object對象值內容的zend_object_handle域就是當前對象在對象池中所在的索引,handlers欄位則是將對象進行操作時的處理函數儲存起來。
PHP的弱變數容器的實現方式是相容並包的形式體現。
http://www.bkjia.com/PHPjc/1113138.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1113138.htmlTechArticle深入理解PHP核心(五)變數及資料類型-變數的結構和類型,深入理解核心 原文連結:http://www.orlion.ga/238/ 程式設計語言的類型可以分為強型別和弱類...