C 語言是怎樣實現儲存一個 PHP5 的變數?

Packie發表於2019-06-17

剖析結構體 zend/zend.h 標頭檔案

typedef struct _zval_struct zval;

typedef union _zvalue_value{
    long lval;
    double dval;
    struct{
        cha *val;
        int len;
    }str;

    HashTable *ht; // HashTable 實現陣列的儲存,應用比較廣泛,有興趣可以閱讀 C 語言原始碼
    zend_object_value obj;
}zvalue_value

struct _zval_struct {
    zvalue_value value;
    zend_uint refcount;
    zend_uchar type;
    zend_uchar is_ref;
};
  • zvalue_value value : 變數的值,PHP 變數的值儲存在這裡
  • zend_uint refcount : 變數的引用數,變數引用計算器
  • zend_char type : 變數的型別
  • zend_uchar is_ref : 變數是否被引用

zval 結構體的 value 成員變數是一個 zvalue_value 聯合體
PHP 能支援任何結構也是因為這個聯合體
當變數是整數,整數的值會儲存到 long lval;
當變數是字串,字串的值會儲存到 str

PHP 語言層型別 儲存在 zvalue_value 的成員變數
Long,bool,resource lval
double dval
string str(len 長度,val 儲存字串的值)
array ht
object obj

type 儲存變數的型別,如下

#define IS_NULL  //表示 NULL 型別
#define IS_LONG  //表示整數型別
#define IS_DOUBLE //表示浮點數型別 
#define IS_STRING //表示字串型別
#define IS_ARRAY  //表示陣列型別
#define IS_OBJECT //表示物件型別
#define IS_BOOL   //表示 bool 型別
#define IS_RESOURCE //表示資源型別

今天剛在這論壇釋出第一篇文章,更多請關注我的 blog :https://blog.biyongyao.com

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Bilyooyam

相關文章