Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Artikel ini akan membawa anda menganalisis zval php7

Artikel ini akan membawa anda menganalisis zval php7

藏色散人
藏色散人ke hadapan
2021-09-15 17:15:102996semak imbas

Zval ialah salah satu struktur data yang paling penting dalam PHP. Ia mengandungi maklumat tentang nilai dan jenis pembolehubah dalam PHP.

1. zval

1.1 Struktur 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;};

Struktur zval agak mudah dan terdiri daripada tiga bahagian:

  • zend_value: Menyimpan nilai atau penunjuk jenis pembolehubah tertentu
  • Peranan teras u1 ialah untuk membezakan jenis
  • u2 ialah nilai tambahan

Untuk paparan yang lebih intuitif Seterusnya, mari lihat struktur zval dan nilai medan teras, seperti yang ditunjukkan dalam gambar di atas.
Artikel ini akan membawa anda menganalisis zval php7

Penjelasan untuk u1.v.type:

  1. IS_UNDEF: Tanda tidak ditentukan, menunjukkan bahawa data boleh ditimpa atau dipadamkan. Sebagai contoh, apabila melakukan operasi yang tidak ditetapkan pada elemen tatasusunan, PHP 7 tidak akan memadamkan data secara langsung daripada memori yang diperuntukkan kepada HashTable Sebaliknya, ia akan menandakan kedudukan Baldi di mana elemen terletak sebagai IS_UNDEF bilangan elemen IS_UNDEF dalam HashTable ialah Apabila ambang tertentu dicapai, elemen yang ditandakan oleh IS_UNDEF akan ditimpa atau dipadamkan semasa operasi rehash.
  2. IS_TRUE dan IS_FALSE: Di sini IS_BOOL dioptimumkan kepada dua, dan teg jenis Boolean direkodkan secara langsung dalam jenis.
  3. IS_REFERENCE: Ia adalah jenis baharu PHP7 menggunakan kaedah pemprosesan yang berbeza untuk mengendalikan "&"
  4. IS_INDIRECT: Ia juga merupakan jenis baharu Memandangkan reka bentuk HashTable dalam PHP 7 berbeza daripada PHP5 Terdapat perbezaan besar di antara mereka, jadi untuk menyelesaikan masalah jadual simbol global mengakses jadual pembolehubah CV, jenis IS_INDRECT telah diperkenalkan.
  5. IS_PTR: Jenis ini ditakrifkan sebagai jenis penunjuk, digunakan untuk menghuraikan nilai.ptr, biasanya digunakan pada jenis fungsi. Sebagai contoh, mengisytiharkan fungsi atau kaedah.

1.2 zend_value

zend_value bagi zval ditakrifkan seperti berikut:

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;

1.3 zval penggunaan memori

Dalam zval:

  • zend_value ialah kesatuan, hanya menduduki 8 bait. Cukup untuk menyimpan zend_long, double, atau pointer.
  • u1 ialah 4 bait dan menyimpan v atau type_info
  • u2 ialah 4 bait

Artikel ini akan membawa anda menganalisis zval php7

jadi zval diduduki 16 bait . Sejajar dengan itu, dalam php5, saiz zval ialah 48 bait, yang sememangnya merupakan peningkatan yang besar.

2. Storan pembolehubah

2.1 benar, salah, batal

boleh dibezakan secara langsung mengikut zval.u1.v.type tanpa penyertaan zend_value

2.2 panjang, berganda

disimpan terus dalam lval atau dval zend_value.

2.3 Jenis lain (rentetan, tatasusunan, objek, sumber, dsb.)

Gunakan penuding yang sepadan dengan zend_value untuk menunjuk ke struktur khususnya.

Contohnya, struktur jenis rentetan ialah

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

Organisasi memori pembolehubah rentetan adalah seperti yang ditunjukkan dalam rajah di bawah, zval.value.str menunjuk kepada struktur zend_string .
Artikel ini akan membawa anda menganalisis zval php7

Zval ialah salah satu struktur data terpenting dalam PHP, yang mengandungi nilai pembolehubah dalam PHP dan maklumat berkaitan jenis.

Kajian yang disyorkan: "Tutorial PHP7"

Atas ialah kandungan terperinci Artikel ini akan membawa anda menganalisis zval php7. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam