Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari kita bincangkan tentang pembolehubah asas PHP7

Mari kita bincangkan tentang pembolehubah asas PHP7

藏色散人
藏色散人ke hadapan
2021-09-16 15:15:341629semak imbas

Struktur asas pembolehubah

Kita semua tahu bahawa pembolehubah PHP ditaip dengan lemah, dan tidak perlu menentukan taip semasa mengisytiharkan. Jadi bagaimana ini dilaksanakan? Ini harus bermula dengan struktur asas pembolehubah.

Pelaksanaan zval

Dalam fail kod sumber zend_type.h, anda boleh melihat definisi zval:

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     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 */
        uint32_t     access_flags;         /* class constant access flags */
        uint32_t     property_guard;       /* single property guard */
        uint32_t     extra;                /* not further specified */
    } u2;
}

Struktur zval terdiri daripada nilai yang memegang jenis pembolehubah atau The union union zend_value of the pointer and the two union union u1 and u2 form

  • u1

u1 digunakan untuk menyimpan jenis pembolehubah dan jenisnya maklumat. Medan digunakan seperti berikut:

jenis: rekod jenis pembolehubah. Anda boleh mengakses

type_flags melalui u2.v.type: teg yang sepadan dengan jenis pembolehubah unik (seperti jenis pemalar, jenis pengiraan rujukan, jenis tidak berubah Jenis pembolehubah yang berbeza sepadan dengan bendera yang berbeza).

const_flags: bendera jenis malar

terpelihara: medan terpelihara

  • u2

u2 adalah terutamanya fungsi tambahan, disebabkan oleh struktur Memori diselaraskan, jadi ruang u2 telah pun menduduki ruang dengan atau tanpa u2, jadi ia digunakan. Medan tambahan u2 merekodkan banyak jenis maklumat, yang memberi manfaat besar kepada fungsi dalaman, atau meningkatkan keramahan cache atau mengurangkan operasi pengalamatan memori. Beberapa bidang ini diperkenalkan di sini.

seterusnya: digunakan untuk menyelesaikan masalah konflik hash (konflik hash belum difahami lagi) dan merekodkan kedudukan elemen konflik seterusnya.

cache_slot: Cache masa jalan. Apabila melaksanakan fungsi, ia mula-mula akan mencari dalam cache Jika ia tidak ditemui dalam cache, ia kemudian akan mencari dalam jadual fungsi global.

num_args: bilangan parameter yang diluluskan apabila fungsi dipanggil

access_flags: bendera akses kelas objek, seperti persendirian yang dilindungi awam.

  • zend_value
typedef union _zend_value {
    zend_long         lval;                /* 整型*/
    double            dval;                /* 浮点型 */
    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;

Seperti yang dapat dilihat daripada zend__value, jenis long dan double jenis menyimpan nilai secara langsung, manakala jenis lain adalah penunjuk, menunjuk kepada struktur masing-masing . Oleh itu, disebabkan oleh struktur zval, pembolehubah PHP tidak perlu menyatakan jenisnya secara eksplisit apabila mengisytiharkannya, kerana tidak kira jenis nilai yang anda berikan kepada pembolehubah, ia boleh membantu anda mencari struktur storan yang sepadan.

Ambil pembolehubah yang nilainya adalah rentetan sebagai contoh strukturnya adalah seperti berikut:

Perbandingan struktur zval PHP5 dan PHP7

  • PHP5
  • PHP7

Anda dapat melihat bahawa zval php7 hanya menduduki 16 bait secara keseluruhan, yang menjimatkan banyak memori berbanding dengan 48 bait zval yang diduduki oleh PHP5.

Selain itu, dalam PHP5, semua pembolehubah diperuntukkan dalam timbunan, tetapi untuk pembolehubah sementara, tidak perlu untuk memperuntukkan dalam timbunan. Oleh itu, ini telah dioptimumkan dalam PHP7, dan pembolehubah sementara digunakan secara langsung pada timbunan.

Jenis pembolehubah biasa

Berikut memperkenalkan beberapa jenis struktur pembolehubah biasa Untuk lebih banyak jenis lain, anda boleh menyemak sendiri kod sumber.

Integer dan jenis titik terapung

Untuk integer dan jenis titik terapung, disebabkan ruangnya yang kecil, nilai integer disimpan terus dalam zval dan disimpan dalam lval, titik terapung Jenis nilai disimpan dalam dval.

typedef union _zend_value {
    zend_long         lval;             /* 整型*/
    double            dval;             /* 浮点型 */
    ... 
 }

String

Struktur rentetan baharu ditakrifkan dalam PHP 7. Strukturnya adalah seperti berikut:

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

Maksud setiap medan di atas:

gc: Maklumat rujukan boleh ubah, semua jenis pembolehubah yang menggunakan pengiraan rujukan akan mempunyai struktur ini.

h: Nilai cincang, digunakan semasa mengira indeks dalam tatasusunan. (Dikatakan bahawa operasi ini meningkatkan prestasi PHP7 sebanyak 5%)

len: Panjang rentetan, keselamatan binari dipastikan melalui nilai ini

val: Kandungan rentetan, struct panjang berubah-ubah, tekan apabila diperuntukkan Panjang Len digunakan untuk memori
Array

array ialah struktur data yang sangat berkuasa dalam PHP Pelaksanaan asasnya ialah HashTable tertib biasa. Butiran lanjut akan diberikan kemudian.

typedef struct _zend_array HashTable;


struct _zend_array {
    zend_refcounted_h gc;
    union {
        struct {
            ZEND_ENDIAN_LOHI_4(
                zend_uchar    flags,
                zend_uchar    nApplyCount,
                zend_uchar    nIteratorsCount,
                zend_uchar    consistency)
        } v;
        uint32_t flags;
    } u;
    uint32_t          nTableMask;
    Bucket           *arData;
    uint32_t          nNumUsed;
    uint32_t          nNumOfElements;
    uint32_t          nTableSize;
    uint32_t          nInternalPointer;
    zend_long         nNextFreeElement;
    dtor_func_t       pDestructor;
}

Objek

Struktur objek PHP7 juga telah direka bentuk semula, yang sangat berbeza daripada pelaksanaan PHP5.

struct _zend_object {
    zend_refcounted_h gc;
    uint32_t          handle;
    zend_class_entry *ce; 
    const zend_object_handlers *handlers;
    HashTable        *properties; 
    zval              properties_table[1];
};

Berikut ialah beberapa medan:

gc: pengepala gc

*ce: kelas yang sepadan dengan kelas objek

*sifat : Struktur HashTable, kunci ialah nama atribut objek, nilai ialah offset nilai atribut dalam tatasusunan properties_tables, dan nilai atribut yang sepadan ditemui dalam properties_talbe melalui offset.

properties_talbe[1]: Menyimpan nilai atribut objek


ok, mari tulis ini di sini dahulu.

Atas ialah kandungan terperinci Mari kita bincangkan tentang pembolehubah asas PHP7. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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