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...