【PHP学习】PHP7的数据类型
PHP中变量名→zval,变量值→zend_value。其变量内存是通过引用计数管理的,在PHP7中引用计数在value结构中。
变量类型:
头文件在PHP源码 /zend/zend_types.h
内部实现:
PHP通过zval这个结构体来表示一个变量,而不同类型的变量值则通过zval嵌入的一个人联合体表示,即zend_value。
zend_value是一个联合体,其代码如下:
ast、ptr、zv这些类型只给内核自己使用。
字符串:
PHP为字符串单独定义了一个结构:zend_string。在zend_value中通过str指向具体结构。
存储字符串内容的val比较特殊。
val并没有使用char*类型,字符串分配时是类似这样操作的:malloc(sizeof(zend_sting)+字符串长度),就是会多分配出一些内存来存储字符串内容,这块多出来的内存起始位置就是val。
这样做的好处可以省去一次内存分配(char*),且更有助于内存管理。
val中多出来的一个字节(结构体中为val[1]而不是val[0])用于存储存储字符串的最后一个字符"\0"。
比如$a="abc",则对应的zend_string内存结构如左图:
数组:
nTableMask:这个值在散列函数根据key的hash code银蛇元素的存储为位置时用到。nTableMask = -nTableSize 或 nTableMask = ~nTableSize+1。
nNumUsed、nNumOfElements:当删除数组元素时并不会立马从数组中删除,而是将这个元素的类型标为IS_UNDEF,只有在数组容量超限,需要扩容时才会删除。
若没有扩容,则nNumUsed将一直递增,所以其值并不是有效的元素数。nNumOfElements则是数组中有效元素的数量,所以nNumOfElements ≤ nNumUsed。
Bucket结构用力保存元素的key及value。而h是hash code:如果key是数值(及数值索引)那么它的值就是数值索引的值;如果key是字符串,那么它的值就是根据字符串key通过Time33算法计算得到的散列值。h值用来映射元素的存储位置。
数组实现:
为了实现散列表的有序性,PHP中的散列表在散列函数与元素数组之间加了一层映射表,这个映射表也是数组,大小与存储元素的数组相同。
中间映射表存储元素在实际存储的有序数组中的下标:元素按照先后顺序依次插入实际存储数组,然后将其数组下标按照散列函数散列出来的位置存储在新加的映射表中。
散列函数:根据key映射出元素的的存储位置,通常会以取模作为散列函数:key->h % nTableSize。但PHP采用另一种方式:nIndex = key->h | nTableMask。
在PHP数组的结构中并没有发现这个中间映射表,事实上,它与arData放在一起。在数组初始化时,同时分配用于存储Bucket的内存和分配相同数量的uint32_t大小的空间。然后将arData偏移到存储元素数组的位置。
中间映射表可以通过arData向前访问到。
哈希冲突:不同的key值可能计算得到相同的哈希值,在插入散列表时会发生冲突,因为映射表只能存储一个元素。
解决方法:把冲突的Bucket串成链表,即中间映射表映射出来的是一个Bucket链表,而不是一个Bucket,查找时需要遍历这个链表,逐个比较key,从而找到目标元素。
HashTable会记录与它冲突的元素在arData数组中的存储位置。
在设置映射值时,发现中间映射表中要设置的位置已经被之前插入的元素占用了(值不等于初始化的-1),那么会把已经存在的值保存到新插入的Bucket中(即c插入后u2.next=0),然后将映射表中的值更新为新Bucket的存储位置(即映射表中的值:2)。
引用:
引用是一种指向其他类型的结构,类似C语言中指针的概念。当修改引用类型的变量时,其修改将反应到实际引用的变量上。
在PHP中通过&操作符生成一个引用变量,比如$b = &$a,执行时首先为&操作的变量分配一个zend_reference结构,这个结构就是引用类型的结构体,它内嵌了一个zval,此zval的value指向原来zval的value,然后将原zval的类型修改为IS_REFERENCE,原zval的value指向新创建的zend_reference结构。
例子:
$a = date("Y-m");$b = &$a;
$a为字符串,通过&$a将其转化为引用类型并赋值给了$b,转换后的$a的类型由IS_STRING变为IS_REFERENCE,$a的value也转变为zend_reference结构,这个结构指向原来的字符串。
$a、$b间接指向了实际的value值。
使用引用时需要注意,引用只能通过&产生,不能通过赋值传递。
如上面的例子,再把$b赋值给其他变量,那么传递给新变量的value将是实际引用的值,而不是引用本身。
$a = date("Y-m");$b = &$a;$c = $b; //如果想让$c也引用指向$a/$b引用的值,则:$c = &$b
推荐课程:PHP视频教程
Atas ialah kandungan terperinci 【PHP学习】PHP7的数据类型. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Dalam MySQL, jenis data yang paling sesuai untuk medan jantina ialah jenis penghitungan ENUM. Jenis penghitungan ENUM ialah jenis data yang membenarkan definisi set nilai yang mungkin Medan jantina sesuai untuk menggunakan jenis ENUM kerana jantina biasanya hanya mempunyai dua nilai, iaitu lelaki dan perempuan. Seterusnya, saya akan menggunakan contoh kod khusus untuk menunjukkan cara mencipta medan jantina dalam MySQL dan menggunakan jenis penghitungan ENUM untuk menyimpan maklumat jantina. Berikut adalah langkah-langkahnya: Pertama, buat jadual bernama pengguna dalam MySQL, termasuk

Dalam pangkalan data MySQL, medan jantina biasanya boleh disimpan menggunakan jenis ENUM. ENUM ialah jenis penghitungan yang membolehkan kita memilih satu sebagai nilai medan daripada set nilai yang dipratentukan. ENUM ialah pilihan yang baik apabila mewakili pilihan tetap dan terhad seperti jantina. Mari lihat contoh kod tertentu: Katakan kita mempunyai jadual yang dipanggil "pengguna" yang mengandungi maklumat pengguna, termasuk jantina. Sekarang kita ingin mencipta medan untuk jantina, kita boleh mereka bentuk struktur jadual seperti ini: CRE

Python digunakan secara meluas dalam pelbagai bidang dengan sintaksnya yang ringkas dan mudah dibaca. Menguasai struktur asas sintaks Python adalah penting, kedua-duanya untuk meningkatkan kecekapan pengaturcaraan dan untuk mendapatkan pemahaman yang mendalam tentang cara kod tersebut berfungsi. Untuk tujuan ini, artikel ini menyediakan peta minda komprehensif yang memperincikan pelbagai aspek sintaks Python. Pembolehubah dan Jenis Data Pembolehubah ialah bekas yang digunakan untuk menyimpan data dalam Python. Peta minda menunjukkan jenis data Python biasa, termasuk integer, nombor titik terapung, rentetan, nilai Boolean dan senarai. Setiap jenis data mempunyai ciri dan kaedah operasinya sendiri. Operator Operator digunakan untuk melaksanakan pelbagai operasi pada jenis data. Peta minda merangkumi jenis operator yang berbeza dalam Python, seperti operator aritmetik, nisbah

Untuk menyelesaikan pemalam yang tidak menunjukkan isu yang dipasang dalam PHP 7.0: Semak konfigurasi pemalam dan dayakan pemalam. Mulakan semula PHP untuk menggunakan perubahan konfigurasi. Semak kebenaran fail pemalam untuk memastikan ia betul. Pasang kebergantungan yang hilang untuk memastikan pemalam berfungsi dengan betul. Jika semua langkah lain gagal, bina semula PHP. Punca lain yang mungkin termasuk versi pemalam yang tidak serasi, memuatkan versi yang salah atau isu konfigurasi PHP.

1. Pengenalan kepada Python Python ialah bahasa pengaturcaraan tujuan umum yang mudah dipelajari dan berkuasa Ia dicipta oleh Guido van Rossum pada tahun 1991. Falsafah reka bentuk Python menekankan kebolehbacaan kod dan menyediakan pembangun perpustakaan dan alatan yang kaya untuk membantu mereka membina pelbagai aplikasi dengan cepat dan cekap. 2. Sintaks asas Python Sintaks asas Python adalah serupa dengan bahasa pengaturcaraan lain, termasuk pembolehubah, jenis data, pengendali, penyataan aliran kawalan, dsb. Pembolehubah digunakan untuk menyimpan data Jenis data mentakrifkan jenis data yang boleh disimpan oleh pembolehubah. 3. Jenis data Python dalam Python

Penjelasan terperinci tentang penggunaan jenis Boolean dalam MySQL MySQL ialah sistem pengurusan pangkalan data hubungan yang biasa digunakan Dalam aplikasi praktikal, selalunya perlu menggunakan jenis Boolean untuk mewakili nilai logik benar dan salah. Terdapat dua kaedah perwakilan jenis Boolean dalam MySQL: TINYINT(1) dan BOOL. Artikel ini akan memperkenalkan secara terperinci penggunaan jenis Boolean dalam MySQL, termasuk definisi, tugasan, pertanyaan dan pengubahsuaian jenis Boolean, dan menerangkannya dengan contoh kod tertentu. 1. Jenis Boolean ditakrifkan dalam MySQL dan boleh

Apabila mereka bentuk jadual pangkalan data, memilih jenis data yang sesuai adalah sangat penting untuk pengoptimuman prestasi dan kecekapan penyimpanan data. Dalam pangkalan data MySQL, sebenarnya tiada apa yang dipanggil pilihan terbaik untuk jenis data untuk menyimpan medan jantina, kerana medan jantina umumnya hanya mempunyai dua nilai: lelaki atau perempuan. Tetapi untuk kecekapan dan penjimatan ruang, kami boleh memilih jenis data yang sesuai untuk menyimpan medan jantina. Dalam MySQL, jenis data yang paling biasa digunakan untuk menyimpan medan jantina ialah jenis penghitungan. Jenis penghitungan ialah jenis data yang boleh mengehadkan nilai medan kepada set terhad.

Jenis data bahasa Go menentukan jenis data dan operasi yang boleh disimpan oleh pembolehubah, termasuk jenis data asas (boolean, integer, nombor titik terapung, nombor kompleks, rentetan, rune, bait) dan jenis data komposit (tatasusunan, kepingan, peta , struktur) badan, antara muka). Bahasa Go menyokong penukaran jenis tersirat dan eksplisit Anda boleh menggunakan sintaks typecastedValue:=type(value) untuk penukaran eksplisit.
