91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中的ZVAL是什么

發布時間:2020-07-02 11:42:31 來源:億速云 閱讀:489 作者:Leah 欄目:編程語言

PHP中的ZVAL是什么?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

ZVAL的基本結構

Zval是PHP中最重要的數據結構之一(另一個比較重要的數據結構是hash table),它包含了PHP中的變量值和類型的相關信息。

它是一個struct,基本結構為:

struct _zval_struct {
    zvalue_value value;     /* 存儲變量的值*/
    zend_uint refcount__gc;  /* 表示引用計數 */
    zend_uchar type;          /* 變量具體的類型 */
    zend_uchar is_ref__gc;    /* 表示是否為引用 */
};
typedef struct _zval_struct zval;

其中:

1、zval_value value

變量的實際值,具體來說是一個zvalue_value的聯合體(union):

typedef union _zvalue_value {
    long lval;                  /* long value */
    double dval;                /* double value */
    struct {                    /* string */
        char *val;
        int len;
    } str;
    HashTable *ht;              /* hash table value,used for array */
    zend_object_value obj;      /* object */
} zvalue_value;

2、zend_uint refcount__gc  

該值實際上是一個計數器,用來保存有多少變量(或者符號,symbols, 所有的符號都存在符號表(symble table)中, 不同的作用域使用不同的符號表,關于這一點,我們之后會論述)指向該zval。

在變量生成時,其refcount=1,典型的賦值操作如a=b會令zval的refcount加1,而unset操作會相應的減1。在PHP5.3之前,使用引用計數的機制來實現GC,如果一個zval的 refcount較少到0,那么Zend引擎會認為沒有任何變量指向該zval,因此會釋放該zval所占的內存空間。

但,事情有時并不會那么簡單。后面 我們會看到,單純的引用計數機制無法GC掉循環引用的zval,即使指向該zval的變量已經被unset,從而導致了內存泄露(Memory Leak)。

3、zend_uchar type

該字段用于表明變量的實際類型。在開始學習PHP的時候,我們已經知道,PHP中的變量包括四種標量類(bool,int,float,string),兩種復合類型(array, object)和兩種特殊的類型(resource 和NULL)。

在zend內部,這些類型對應于下面的宏(代碼位置 phpsrc/Zend/zend.h):

#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
#define IS_CONSTANT 8
#define IS_CONSTANT_ARRAY   9
#define IS_CALLABLE 10

4、is_ref__gc

這個字段用于標記變量是否是引用變量。對于普通的變量,該值為0,而對于引用型的變量,該值為1。這個變量會影響zval的共享、分離等。關于這點,我們之后會有論述。

正如名字所示,ref_count__gcis_ref__gc是PHP的GC機制所需的很重要的兩個字段,這兩個字段的值,可以通過xdebug等調試工具查看。

關于PHP中的ZVAL是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武隆县| 裕民县| 长丰县| 灌云县| 昭觉县| 泗洪县| 镇宁| 德州市| 裕民县| 海盐县| 共和县| 丹棱县| 阳原县| 都匀市| 云霄县| 江津市| 泾阳县| 开鲁县| 孙吴县| 信宜市| 文山县| 壶关县| 丹阳市| 巫溪县| 江口县| 香格里拉县| 武夷山市| 简阳市| 蕉岭县| 济南市| 新干县| 永顺县| 双桥区| 蒲城县| 洪泽县| 同江市| 加查县| 临沂市| 秦安县| 林甸县| 昭通市|