php變數的實作方法:先宣告一個zval指針,並申請一塊記憶體;然後透過【ZVAL_STRING】巨集將值設為bar;最後是將這個zval加入到目前的符號表裡去,並將其label定義成foo。
【相關學習推薦:php圖文教學】
php變數的實作方法:
簡介
在官方的PHP實作內部,所有變數都使用同一種資料結構(zval)來保存,而這個結構同時表示PHP中的各種資料類型。它不僅包含變數的值,也包含變數的類型。這就是PHP弱型態的核心。
標量類型: boolean、integer、float(double)、string
複合型別: array、object
特殊型別: resource、NULL
變數的儲存結構
PHP在核心中是透過zval這個結構體來儲存變數的,它的定義在Zend/zend.h檔案裡,簡短精煉,只有四個成員組成:
struct _zval_struct { zvalue_value value; /* 变量的值 */ zend_uint refcount__gc; zend_uchar type; /* 变量当前的数据类型 */ zend_uchar is_ref__gc; }; typedef struct _zval_struct zval; //在Zend/zend_types.h里定义的: typedef unsigned int zend_uint; typedef unsigned char zend_uchar;
refcount__gc 表示引用計數1
#is_ref__gc 表示是否為引用0
value 儲存變數的值
#變數的型別
zval結構體的type字段就是實作弱型別最關鍵的字段,type的值可以是: IS_NULL 、
IS_BOOL、
IS_LONG、
IS_DOUBLE、
IS_STRING、
IS_ARRAY、
IS_OBJECT、
IS_RESOURCE。從字面上就很好理解,他們只是類型的唯一標示,根據類型的不同將不同的值儲存到value欄位。除此之外,和他們定義在一起的型別還有
IS_CONSTANT和
IS_CONSTANT_ARRAY。
範例
<?php $foo = 'bar'; ?>上面是一段PHP語言的例子,建立一個變量,並把它的值設為'bar',步驟: 建立一個zval結構,並設定其類型。設定值為'bar'。將其加入目前作用域的符號表,這樣使用者才能在PHP裡使用這個變數 具體的程式碼為:
{ zval *fooval; MAKE_STD_ZVAL(fooval); ZVAL_STRING(fooval, "bar", 1); ZEND_SET_SYMBOL( EG(active_symbol_table) , "foo" , fooval); }首先,我們宣告一個zval指針,併申請一塊記憶體。然後透過ZVAL_STRING巨集將值設為bar,最後一行的作用就是將這個zval加入到目前的符號表裡去,並將其label定義成foo,這樣使用者就可以在程式碼裡透過$foo來使用它。
相關學習推薦:php程式設計(影片)
#
以上是php變數是如何實現的的詳細內容。更多資訊請關注PHP中文網其他相關文章!