Jadual Kandungan
zval dalam kod sumber PHP
Rumah pembangunan bahagian belakang tutorial php Bagaimanakah PHP menyimpan pembolehubah? Adakah anda memahami struktur zval?

Bagaimanakah PHP menyimpan pembolehubah? Adakah anda memahami struktur zval?

May 26, 2022 am 09:47 AM
php pembolehubah zval

zval dalam kod sumber PHP

Tidak perlu mengisytiharkan jenis semasa mentakrifkan pembolehubah dalam PHP Pada mulanya, nilai integer diberikan kepada pembolehubah $a, dan ia boleh ditukar dengan mudah kepada yang lain jenis nanti. Jadi bagaimana pembolehubah ini $a disimpan dalam kod sumber PHP? Dengan memikirkan soalan ini, mari kita lihat kod sumber PHP.

Kod sumber PHP ditulis dalam C. Struktur zval digunakan dalam kod sumber PHP untuk menyimpan pembolehubah yang dicipta dalam kod PHP. Mari kita keluarkan definisi struktur zval dan menganalisisnya secara ringkas.

Ini ialah repositori rasmi PHP pada Github: github.com/php/php-src Cawangan yang digunakan dalam artikel ini ialah PHP-7.4.29.

zval structure

Cari fail ini dalam kod sumber PHP: php-src/Zend/zend_types.h, anda boleh melihat bahawa struktur zval ditakrifkan seperti berikut , sebelah kiri ialah kod sumber. Kod sumber menggunakan jenis PHP yang ditentukan sendiri zend_uchar, uint16_t, uint32_t, dsb. Jenis ini akan ditukar kepada char short int, dsb. di bawah platform dan penyusun yang berbeza untuk platform. Untuk memudahkan pemahaman, saya menterjemahkannya ke dalam jenis biasa dan memaparkannya di sebelah kanan kod sumber. Pada masa yang sama, fungsi makro ZEND_ENDIAN_LOHI_3() juga dikembangkan.

typedef struct _zval_struct zval;
...
       《源代码》                                               《翻译后》
-------------------------------------------------------------------------------------------
struct _zval_struct {                               | struct _zval_struct {
    zend_value value;                               |     zend_value value;
    union {                                         |     union {
        struct {                                    |         struct {
            ZEND_ENDIAN_LOHI_3(                     |             unsigned char type;
                zend_uchar type,                    |             unsigned char type_flags;
                zend_uchar type_flags,              |             union {
                union {                             |                 unsigned short extra;
                    uint16_t extra;                 |             } u;
                } u                                 |         } v;
            )                                       |         unsigned int type_info;
        } v;                                        |     } u1;
        uint32_t type_info;                         |     union {
    } u1;                                           |         unsigned int next;
    union {                                         |         unsigned int cache_slot;
        uint32_t next;                              |         unsigned int opline_num;
        uint32_t cache_slot;                        |         unsigned int lineno;
        uint32_t opline_num;                        |         unsigned int num_args;
        uint32_t lineno;                            |         unsigned int fe_pos;
        uint32_t num_args;                          |         unsigned int fe_iter_idx;
        uint32_t fe_pos;                            |         unsigned int access_flags;
        uint32_t fe_iter_idx;                       |         unsigned int property_guard;
        uint32_t access_flags;                      |         unsigned int constant_flags;
        uint32_t property_guard;                    |         unsigned int extra;
        uint32_t constant_flags;                    |     } u2;
        uint32_t extra;                             | };
    } u2;                                           |
};                                                  |
Salin selepas log masuk

Dalam struktur zval, nilai pembolehubah disimpan dalam atribut nilai jenis zend_value. Dan gunakan u1.v.type untuk merekodkan jenis nilai ini Sebagai contoh, IS_LONG sepadan dengan jenis integer dan IS_STRING sepadan dengan jenis rentetan.

zend_value union

Jenis zend_value juga ditakrifkan dalam php-src/Zend/zend_types.h dan ialah kesatuan yang berikut ialah takrifan zend_value , sebelah kiri ialah kod sumber. Juga di sebelah kanan, saya juga membuat terjemahan mudah, menterjemah zend_long uint32_t ke dalam jenis biasa untuk tontonan mudah.

            《源代码》                                              《翻译后》
------------------------------------------------------------------------------------
typedef union _zend_value {                         | typedef union _zend_value {
    zend_long         lval; /* long value */        |     long              lval;
    double            dval; /* double value */      |     double            dval;
    zend_refcounted  *counted;                      |     zend_refcounted  *counted;
    zend_string      *str;                          |     zend_string      *str;
    zend_array       *arr;                          |     zend_array       *arr;
    zend_object      *obj;                          |     zend_object      *obj;
    zend_resource    *res;                          |     zend_resource    *res;
    zend_reference   *ref;                          |     zend_reference   *ref;
    zend_ast_ref     *ast;                          |     zend_ast_ref     *ast;
    zval             *zv;                           |     zval             *zv;
    void             *ptr;                          |     void             *ptr;
    zend_class_entry *ce;                           |     zend_class_entry *ce;
    zend_function    *func;                         |     zend_function    *func;
    struct {                                        |     struct {
        uint32_t w1;                                |         unsigned int w1;
        uint32_t w2;                                |         unsigned int w2;
    } ww;                                           |     } ww;
} zend_value;                                       | } zend_value;
Salin selepas log masuk

Satu ciri kesatuan ialah memori yang didudukinya ialah panjang yang sepadan dengan jenis terbesar dalam atributnya. Antaranya, zend_long adalah jenis panjang Anda boleh melihat bahawa panjang lval jenis panjang dan dval jenis berganda adalah kedua-duanya 8 bait. Jenis penunjuk lain di dalamnya juga 8 bait. Atribut struktur terakhir ww terdiri daripada dua jenis int, dan panjang gabungan juga ialah 8 bait. Oleh itu, panjang kesatuan ini ialah 8 bait.

Dalam kod PHP yang kami tulis, nilai data integer dan titik terapung akan disimpan terus dalam lval dan dval. Jika ia adalah rentetan, tatasusunan atau jenis lain, ruang akan diperuntukkan untuk menyimpan data dan alamatnya akan disimpan dalam zend_value, iaitu atribut zval.value, seperti: zval.value.zend_long = 9527, zval .value.zend_string = alamat String aksara, zval.value.zend_array = alamat tatasusunan. Kemudian tandakan pada zval.u1.v.type bahawa zval.value ini ialah integer, titik terapung, rentetan atau jenis lain.

takrif jenis zval.u1.v.type juga terdapat dalam fail php-src/Zend/zend_types.h Semua definisi adalah seperti berikut:

/* regular data types */
#define IS_UNDEF        0
#define IS_NULL         1
#define IS_FALSE        2
#define IS_TRUE         3
#define IS_LONG         4
#define IS_DOUBLE       5
#define IS_STRING       6
#define IS_ARRAY        7
#define IS_OBJECT       8
#define IS_RESOURCE     9
#define IS_REFERENCE    10
/* constant expressions */
#define IS_CONSTANT_AST 11
/* internal types */
#define IS_INDIRECT     13
#define IS_PTR          14
#define IS_ALIAS_PTR    15
#define _IS_ERROR       15
/* fake types used only for type hinting (Z_TYPE(zv) can not use them) */
#define _IS_BOOL        16
#define IS_CALLABLE     17
#define IS_ITERABLE     18
#define IS_VOID         19
#define _IS_NUMBER      20
Salin selepas log masuk

struktur zval. memori Diduduki

Seterusnya kita menganalisis memori yang diperlukan oleh zval.

  • nilai: jenis zend_value 8 bait.

  • u1:

  • u1.v.type: unsigned char 1 bait, u1.v.type_flags : unsigned char 1 bait, u1.v.u: Terdapat hanya satu atribut tambahan pendek yang tidak ditandatangani dalam gabungan 2 bait, jadi struktur u1.v ialah 4 bait secara keseluruhan.

  • u1.type_info: unsigned int 4 bait.

  • Oleh itu, panjang kesatuan u1 ialah panjang atribut terpanjang: 4 bait.

  • u2: Ia juga merupakan kesatuan, yang mengandungi atribut jenis int, jadi panjangnya ialah 4 bait.

  • Jadi jumlah memori yang diduduki oleh zval ialah 8 4 4 = 16 bait.

Maksudnya, apabila kita menulis kod PHP, jika kita mencipta pembolehubah integer, ia sebenarnya akan menduduki 16 bait memori semasa operasi, overhed memori Sekurang-kurangnya dua kali lebih lama daripada C bahasa. Sudah tentu, overhed berganda ini juga membawa fleksibiliti PHP dalam mengendalikan pembolehubah.

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Bagaimanakah PHP menyimpan pembolehubah? Adakah anda memahami struktur zval?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Program PHP untuk mengira vokal dalam rentetan Program PHP untuk mengira vokal dalam rentetan Feb 07, 2025 pm 12:12 PM

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini 7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini Nov 13, 2024 am 09:42 AM

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apr 03, 2025 am 12:03 AM

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

See all articles