PHP ZVAL est l'une des structures de données les plus importantes de PHP. Elle contient des informations sur les valeurs et les types de variables en PHP. Il s'agit d'une structure de base [struct _zval_struct (valeur zvalue_value type zend_uchar). )] .
PHP ZVAL signifie :
Structure de base de ZVAL
Zval est l'une des structures de données les plus importantes en PHP (une autre structure de données importante est hash table
), qui contient des informations sur les valeurs et les types de variables en PHP.
C'est une struct, la structure de base est :
struct _zval_struct { zvalue_value value; /* 存储变量的值*/ zend_uint refcount__gc; /* 表示引用计数 */ zend_uchar type; /* 变量具体的类型 */ zend_uchar is_ref__gc; /* 表示是否为引用 */ }; typedef struct _zval_struct zval;
Parmi eux :
1, zval_value value
La valeur réelle de la variable
, plus précisément une union de zvalue_value
:
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
Cette valeur est en fait un compteur pour enregistrer le nombre de variables (ou symboles, symboles) qu'il y a. Tous les symboles sont stockés dans la table des symboles (table des symboles) Différentes étendues utilisent des symboles différents (nous en discuterons). ceci plus tard) pointe vers le zval.
Lorsqu'une variable est générée, son refcount=1. Une opération d'affectation typique telle que a=b augmentera le refcount de zval de 1, et l'opération de non-définition le diminuera de 1 en conséquence. Avant PHP5.3, le mécanisme de comptage de références était utilisé pour implémenter GC Si le refcount d'un zval était inférieur à 0, le moteur Zend penserait qu'il n'y avait aucune variable pointant vers le zval, et libérerait donc l'espace mémoire occupé par. le zval.
Mais parfois, les choses ne sont pas si simples. Nous verrons plus tard que le simple mécanisme de comptage de références ne peut pas GC le zval référencé circulairement, même si la variable pointant vers le zval a été non définie, ce qui entraîne une fuite de mémoire (Memory Leak).
3. zend_uchar type
Ce champ est utilisé pour indiquer le type réel de la variable. Lorsque nous avons commencé à apprendre PHP, nous savions déjà que les variables PHP incluent quatre classes scalaires (bool, int, float, string), deux types composites (array, object) et deux types spéciaux (resource et NULL).
Dans zend, ces types correspondent aux macros suivantes (emplacement du code 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
Ce champ permet de marquer si la variable est une variable de référence. Pour les variables ordinaires, la valeur est 0 et pour les variables de référence, la valeur est 1. Cette variable affectera le partage, la séparation, etc. de zval. Nous en discuterons plus tard.
Comme son nom l'indique, ref_count__gc
et is_ref__gc
sont deux champs très importants requis par le mécanisme GC de PHP. Les valeurs de ces deux champs peuvent être visualisées via des outils de débogage tels que xdebug.
Recommandations d'apprentissage associées : Programmation PHP de l'entrée à la maîtrise
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!