PHP 變量的實現原理

PHP是一門弱語言,也就說PHP的一個變量能夠保存任意類型的變量,PHP是用C語言實現的,而C語言是一個強類型的語言,每一個變量都有固定的類型,不能隨意改變變量的類型(雖然能夠經過強制類型轉換,可能會出問題)。在zend引擎中的實現:web

引用的是PHP 5的源碼:數據庫

 

打開zend.h 會發現定義了以下的結構體:數組

 

typedef struct _zval_struct     zval;安全

 

typedef union _zvalue_value {函數

long lval; /* long value */學習

double dval; /* double value */ui

struct {spa

char *val;指針

int len;orm

} str;

HashTable *ht; /* hash table value */

zend_object_value obj;

zend_ast *ast;

} zvalue_value;

 

struct _zval_struct {

/* Variable information */

zvalue_value value; /* value */

zend_uint refcount__gc;

zend_uchar type; /* active type */

zend_uchar is_ref__gc;

 

};

其中 zval 就是PHP的變量的底層實現,zval是用結構體來實現的。

zvalue_value中:

lval 是long類型數據,便是C語言中long。

dval 是double類型數據,便是C語言中double。

str  是一個結構體,成員變量var是char類型的指針,指向一個字符數組的首地址,爲了數據安全,用len告訴系統要取多長的數據。

ht   是一個hash表結構,是爲了存儲數組;

obj  是爲了存儲對象類型;其中zend_object_value 就是zend爲了存儲對象而定義的結構體。

ast  是PHP 5.6之後纔有的,是爲了存儲常量;

 

在_zval_struct中,

value  便是上述所說的zvalue_value,也就是存儲的數據;

refcount__gc 便是變量的引用數,變量引用計算器。

type 變量的類型,爲了保存當前所存儲的數據,是哪個類型的數據;經常使用類型以下所示:

#define IS_NULL 0

#define IS_LONG 1

#define IS_DOUBLE 2

#define IS_BOOL 3

#define IS_ARRAY 4

#define IS_OBJECT 5

#define IS_STRING 6

 

#define IS_RESOURCE 7

 

is_ref__gc 變量是否被引用。

 

對變量類型的解析:

IS_NULL

0

IS_LONG

1

long類型變量

IS_DOUBLE

2

double類型變量

IS_BOOL

3

布爾變量

IS_ARRAY

4

數組

IS_OBJECT

5

對象

IS_STRING

6

字符串

IS_RESOURCE

7

資源類型變量

 

關於資源類型的變量:資源類型是一種特殊的變量,保存了到外部資源的一個引用。好比數據庫的鏈接,打開文件,圖形畫布區域;

資源類型本質上存儲是一個整數,也就是resource ID ,zend能夠根據這個ID去找到最終所須要的數據;

例如:$file_source = fopen(「a.txt」,」r」);

能夠用is_resource()函數測定一個變量是不是資源,函數get_resource_type()則返回該資源的類型。

關於變量的賦值會有 寫時複製機制。

 

更過的進階技術能夠關注公衆號:進階的腳步  回覆學習資料  有驚喜哦

相關文章
相關標籤/搜索