Heim > Backend-Entwicklung > PHP7 > In diesem Artikel erfahren Sie, wie Sie den Zval von PHP7 analysieren

In diesem Artikel erfahren Sie, wie Sie den Zval von PHP7 analysieren

藏色散人
Freigeben: 2023-02-18 08:14:01
nach vorne
3063 Leute haben es durchsucht

Zval ist eine der wichtigsten Datenstrukturen in PHP. Sie enthält Informationen über den Wert und Typ von Variablen in PHP.

1. zval

1.1 Die Struktur von 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;};
Nach dem Login kopieren

zval-Struktur ist relativ einfach und besteht aus drei Teilen:

  • zend_value: speichert den Wert oder Zeiger des spezifischen Variablentyps
  • Der Kern Funktion von u1 ist Unterscheiden Sie den Typ
  • u2 als Hilfswert

Um die Struktur von zval und den Wert des Kernfelds intuitiver zu sehen, machen wir das Bild oben.
In diesem Artikel erfahren Sie, wie Sie den Zval von PHP7 analysieren

Erklärung für u1.v.type:

  1. IS_UNDEF: Die Markierung ist undefiniert, was darauf hinweist, dass die Daten überschrieben oder gelöscht werden können. Wenn Sie beispielsweise eine nicht festgelegte Operation für ein Array-Element ausführen, löscht PHP 7 die Daten nicht direkt aus dem der HashTable zugewiesenen Speicher. Stattdessen markiert es zunächst den Speicherort des Buckets, in dem sich das Element befindet, als IS_UNDEF Die Anzahl der IS_UNDEF-Elemente in der HashTable beträgt. Wenn ein bestimmter Schwellenwert erreicht ist, werden die mit IS_UNDEF markierten Elemente während des Rehash-Vorgangs überschrieben oder gelöscht.
  2. IS_TRUE und IS_FALSE: Hier wird IS_BOOL in zwei optimiert und das boolesche Typ-Tag wird direkt im Typ aufgezeichnet.
  3. IS_REFERENCE: Es handelt sich um einen neuen Typ, um „&“ zu verarbeiten.
  4. IS_INDIRECT: Da sich das Design von HashTable in PHP 7 stark von dem in PHP5 unterscheidet Um das Problem des globalen Symboltabellenzugriffs auf die CV-Variablentabelle zu lösen, wurde der Typ IS_INDRECT eingeführt.
  5. IS_PTR: Dieser Typ ist als Zeigertyp definiert, der zum Parsen von value.ptr verwendet wird und normalerweise für Funktionstypen verwendet wird. Deklarieren Sie beispielsweise eine Funktion oder Methode.

1.2 zend_value

Die Definition von zend_value in zval lautet wie folgt:

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;
Nach dem Login kopieren

1.3 zval-Speichernutzung

In einem zval:

  • zend_value ist eine Union und belegt nur 8 Bytes. Gerade genug, um einen zend_long, einen Double oder einen Zeiger zu speichern.
  • u1 ist 4 Bytes und speichert ein v oder type_info
  • u2 ist 4 Bytes

In diesem Artikel erfahren Sie, wie Sie den Zval von PHP7 analysieren

also belegt ein zval 16 Bytes. Dementsprechend beträgt die Größe eines ZVAL in PHP5 48 Byte, was in der Tat eine enorme Verbesserung darstellt.

2. Variablenspeicher

2.1 true, false, null

können direkt nach zval.u1.v.type ohne Beteiligung von zend_value unterschieden werden

2.2 long, double

werden direkt im lval oder dval gespeichert von zend_value.

2.3 Andere Typen (String, Array, Objekt, Ressource usw.)

Verwenden Sie den Zeiger, der zend_value entspricht, um auf seine spezifische Struktur zu zeigen.

Zum Beispiel ist die Struktur des String-Typs

struct _zend_string {
    zend_refcounted_h gc;
    zend_ulong        h;                /* hash value */
    size_t            len;
    char              val[1];
};
Nach dem Login kopieren

Die Speicherorganisation einer String-Variablen ist wie in der Abbildung unten dargestellt, zval.value.str zeigt auf die zend_string-Struktur.
In diesem Artikel erfahren Sie, wie Sie den Zval von PHP7 analysieren

Zval ist eine der wichtigsten Datenstrukturen in PHP. Sie enthält Informationen über den Wert und Typ von Variablen in PHP.

Empfohlenes Lernen: „PHP7-Tutorial

Das obige ist der detaillierte Inhalt vonIn diesem Artikel erfahren Sie, wie Sie den Zval von PHP7 analysieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage