Maison > développement back-end > PHP7 > le corps du texte

Cet article vous amènera à analyser le zval de php7

藏色散人
Libérer: 2023-02-18 08:14:01
avant
3001 Les gens l'ont consulté

Zval est l'une des structures de données les plus importantes de PHP. Elle contient des informations sur la valeur et le type des variables en PHP.

1. zval

1.1 La structure de zval (zend_types.h)

typedef struct _zval_struct     zval;struct _zval_struct {
    zend_value        value;            /* value */
    union {
        struct {
            ZEND_ENDIAN_LOHI_4(
                zend_uchar    type,         /* active type */
                zend_uchar    type_flags,
                zend_uchar    const_flags,
                zend_uchar    reserved)     /* call info for EX(This) */
        } v;
        uint32_t type_info;
    } u1;
    union {
        uint32_t     var_flags;
        uint32_t     next;                 /* hash collision chain */
        uint32_t     cache_slot;           /* literal cache slot */
        uint32_t     lineno;               /* line number (for ast nodes) */
        uint32_t     num_args;             /* arguments number for EX(This) */
        uint32_t     fe_pos;               /* foreach position */
        uint32_t     fe_iter_idx;          /* foreach iterator index */
    } u2;};
Copier après la connexion

la structure de zval est relativement simple et se compose de trois parties :

  • zend_value : enregistre la valeur ou le pointeur du type de variable spécifique
  • Le noyau la fonction de u1 est Distinguer le type
  • u2 comme valeur auxiliaire

Afin de voir la structure de zval et la valeur du champ principal de manière plus intuitive, prenons la photo ci-dessus.
Cet article vous amènera à analyser le zval de php7

Explication pour u1.v.type :

  1. IS_UNDEF : La marque n'est pas définie, indiquant que les données peuvent être écrasées ou supprimées. Par exemple, lors de l'exécution d'une opération non définie sur un élément du tableau, PHP 7 ne supprimera pas directement les données de la mémoire allouée au HashTable. Au lieu de cela, il marquera d'abord la position du bucket où se trouve l'élément comme IS_UNDEF. Le nombre d'éléments IS_UNDEF dans la HashTable est Lorsqu'un certain seuil est atteint, les éléments marqués par IS_UNDEF seront écrasés ou supprimés lors de l'opération de rehachage.
  2. IS_TRUE et IS_FALSE : Ici IS_BOOL est optimisé en deux, et la balise de type booléen est directement enregistrée en type.
  3. IS_REFERENCE : C'est un nouveau type. PHP7 utilise des méthodes de traitement différentes pour gérer "&".
  4. IS_INDIRECT : C'est aussi un nouveau type puisque la conception de HashTable en PHP 7 est très différente de celle de PHP5, donc To. Pour résoudre le problème de l'accès à la table de symboles globale à la table des variables CV, le type IS_INDRECT a été introduit.
  5. IS_PTR : ce type est défini comme un type de pointeur, utilisé pour analyser value.ptr, généralement utilisé sur les types de fonctions. Par exemple, déclarez une fonction ou une méthode.

1.2 zend_value

La définition de zend_value dans zval est la suivante :

typedef union _zend_value {
    zend_long         lval;             /* long value */
    double            dval;             /* double value */
    zend_refcounted  *counted;
    zend_string      *str;
    zend_array       *arr;
    zend_object      *obj;
    zend_resource    *res;
    zend_reference   *ref;
    zend_ast_ref     *ast;
    zval             *zv;
    void             *ptr;
    zend_class_entry *ce;
    zend_function    *func;
    struct {
        uint32_t w1;
        uint32_t w2;
    } ww;
} zend_value;
Copier après la connexion

1.3 Utilisation de la mémoire zval

Dans un zval :

  • zend_value est une union et n'occupe que 8 octets. Juste assez pour stocker un zend_long, un double ou un pointeur.
  • u1 fait 4 octets et stocke un v ou type_info
  • u2 fait 4 octets

Cet article vous amènera à analyser le zval de php7

donc un zval occupe 16 octets. En conséquence, en php5, la taille d'un zval est de 48 octets, ce qui constitue en effet une énorme amélioration.

2. Stockage variable

2.1 true, false, null

peuvent être directement distingués selon zval.u1.v.type, sans la participation de zend_value

2.2 long, double

sont directement stockés dans le lval ou dval de zend_value.

2.3 Autres types (chaîne, tableau, objet, ressource, etc.)

Utilisez le pointeur correspondant à zend_value pour pointer vers sa structure spécifique.

Par exemple, la structure du type chaîne est

struct _zend_string {
    zend_refcounted_h gc;
    zend_ulong        h;                /* hash value */
    size_t            len;
    char              val[1];
};
Copier après la connexion

L'organisation de la mémoire d'une variable chaîne est comme indiqué dans la figure ci-dessous, zval.value.str pointe vers la structure zend_string.
Cet article vous amènera à analyser le zval de php7

Zval est l'une des structures de données les plus importantes de PHP. Elle contient des informations sur la valeur et le type des variables en PHP.

Apprentissage recommandé : "Tutoriel PHP7"

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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!