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'; ?>
{ zval *fooval; MAKE_STD_ZVAL(fooval); ZVAL_STRING(fooval, "bar", 1); ZEND_SET_SYMBOL( EG(active_symbol_table) , "foo" , fooval); }
相關學習推薦:php程式設計(影片)
#
以上是php變數是如何實現的的詳細內容。更多資訊請關注PHP中文網其他相關文章!