PHP變數在zend核心中的儲存方式

2021-07-04 05:42:00 字數 1379 閱讀 4177

php中的變數可以儲存任何的資料型別,這是因為它是弱型別語言。但php是用c語言編寫的,c語言是強型別語言,每個變數都有固定的型別,不能隨意改變變數的型別(可以通過強制型別轉變,不過有可能出現問題),在zend引擎中是怎樣可以做到乙個變數儲存任何型別的呢?

在zend/zend.h標頭檔案中,會發現下面的結構體:

typedef struct _zval_struct zval;

typedef union _zvalue_value str;

hashtable *ht;

zend_object_value obj;

} zvalue_value ;

struct _zval_struct ;

zval結構體就是通常用到的php變數在核心中的表達方式。在zval結構體中,可以看到4個成員變數,分別是:

zvalue_value value;  //變數的值,php變數的值就儲存在這裡

zend_uint refcount; //變數引用數,變數引用計算器

zend_uchar type; //變數的型別

zend_uchar is_ref; //變數是否被引用

zval結構體的value成員變數是乙個zvalue_value聯合體,php能夠保持任何的結構型別就是因為這個聯合體。從zvalue_value聯合體的成員變數中可以看到,不同型別會儲存到不同的成員變數中,這樣就實現了php變數可以儲存任何資料型別。例如,當變數是整數型別時,會儲存到value的lval成員變數中;當變數的型別是字串時,又會儲存到value的str成員變數中。

還有乙個問題,就是zend引擎是怎麼知道這個變數儲存的是什麼型別呢?我們注意到,zval結構體中有個type成員變數,這個成員變數就是要儲存乙個php變數的型別。

zend引擎定義了8中變數型別:

#define is_null 0

#define is_long 1

#define is_double 2

#define is_string 3

#define is_array 4

#define is_object 5

#define is_bool 6

#define is_resource 7

每乙個巨集定義對應php語言層的一種型別,例如當zval的type成員變數等於is_string時(zval.type==is_string),說明這個變數的型別是字串型別。

PHP變數在核心中的實現

我們都知道php是乙個弱型別語言,它的變數理論上可以儲存任何型別的資料。那麼,php的變數在核心中究竟是怎麼實現的呢?在php核心中,變數稱為zval,變數的值稱為zend value,注意這是兩個不同的東西。php中變數的記憶體是通過引用計數的方式進行管理的,在php7之前,zval容器中有兩個位...

php核心中的變數

php是弱型別語言,它可以儲存任何的資料型別。但是php是使用c語言編寫的,而c語言是強型別語言。每個變數都有固定的型別,不能隨意改變變數的型別。在zend zend.h中,檢視結構體 zval結構體就是通常用到的php變數在核心總的表示形式,在zval結構體中,可以看到四個成員變數,分別是 zva...

PHP核心中的HashTable

本文和大家分享的主要是php核心的hashtable相關使用,希望通過本文的分享,對大家學習php有所幫助。typedef struct bucket bucket typedef struct hashtable hashtable 這個是乙個簡化過的雜湊表結構 bucket是乙個鍊錶,而 has...