Rumah php教程 php手册 PHP内核探索:变量存储与类型使用说明

PHP内核探索:变量存储与类型使用说明

Jun 06, 2016 pm 08:25 PM
storan berubah-ubah menaip

这篇文章主要介绍了PHP内核探索:变量存储与类型的相关资料,需要的朋友可以参考下

先回答前面一节的那个问题吧。

复制代码 代码如下:


    $foo = 10;
    $bar = 20;

    function change() {
        global $foo;
        //echo '函数内部$foo = '.$foo.'
';
        //如果不把$bar定义为global变量,函数体内是不能访问$bar的
        $bar = 0;
        $foo++;
    }

    change();
    echo $foo, ' ', $bar;
?>

程序输出 11 20。原因是,方法内部无法访问$bar变量,所以它的值还是20。使用global之后,可以取得$foo的值,自增后$foo的值就是11。
Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。
前言中提到变量的三个基本特性,其中的有一个特性为变量的类型,变量都有特定的类型, 如:字符串、数组、对象等等。编程语言的类型系统可以分为强类型和弱类型两种:
强类型语言是一旦某个变量被申明为某个类型的变量,则在程序运行过程中,该不能将该变量的类型以外的值赋予给它 (当然并不完全如此,这可能会涉及到类型的转换,后面的小节会有相应介绍),C/C++/Java等语言就属于这类。
PHP及Ruby,JavaScript等脚本语言属于弱类型语言:一个变量可以表示任意的数据类型。
PHP之所以成为一个简单而强大的语言,很大一部分的原因是它拥有弱类型的变量。 但是有些时候这也是一把双刃剑,使用不当也会带来一些问题。就像仪器一样,越是功能强大, 出现错误的可能性也就越大。
在官方的PHP实现内部,所有变量使用同一种数据结构(zval)来保存,而这个结构同时表示PHP中的各种数据类型。 它不仅仅包含变量的值,也包含变量的类型。这就是PHP弱类型的核心。
那zval结构具体是如何实现弱类型的呢,下面我们一起来揭开面纱。
变量存储结构
PHP在声明或使用变量的时候,并不需要显式指明其数据类型。
PHP是弱类型语言,这并不表示PHP没有类型,在PHP中,存在8种变量类型,可以分为三类
* 标量类型:boolean、integer、float(double)、string
* 复合类型: array、object
* 特殊类型: resource、NULL
官方PHP是用C实现的,而C是强类型的语言,那这是怎么实现PHP中的弱类型的呢?
变量的值存储到以下所示zval结构体中。 zval结构体定义在Zend/zend.h文件,其结构如下:

复制代码 代码如下:


typedef struct _zval_struct zval;
...
struct _zval_struct {
    /* Variable information */
    zvalue_value value; /* value */
    zend_uint refcount__gc;
    zend_uchar type; /* active type */
    zend_uchar is_ref__gc;
};

PHP使用这个结构来存储变量的所有数据。和其他编译性静态语言不同, PHP在存储变量时将PHP用户空间的变量类型也保存在同一个结构体中。这样我们就能通过这些信息获取到变量的类型。
zval结构体中有四个字段,其含义分别为:

属性名 含义 默认值

refcount__gc 表示引用计数 1

is_ref__gc 表示是否为引用 0

value 存储变量的值

type 变量具体的类型


在PHP5.3之后,引入了新的垃圾收集机制,引用计数和引用的字段名改为refcount__gc和is_ref__gc。在此之前为refcount和is__ref。

而变量的值则存储在另外一个结构体zvalue_value中。值存储见下面的介绍。
PHP用户空间指的在PHP语言这一层面,而本书中大部分地方都在探讨PHP的实现。 这些实现可以理解为内核空间。由于PHP使用C实现,而这个空间的范畴就会限制在C语言。 而PHP用户空间则会受限于PHP语法及功能提供的范畴之内。 例如有些PHP扩展会提供一些PHP函数或者类,这就是向PHP用户空间导出了方法或类。
变量类型
zval结构体的type字段就是实现弱类型最关键的字段了,type的值可以为: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE 之一。 从字面上就很好理解,他们只是类型的唯一标示,根据类型的不同将不同的值存储到value字段。 除此之外,,和他们定义在一起的类型还有IS_CONSTANT和IS_CONSTANT_ARRAY。
这和我们设计数据库时的做法类似,为了避免重复设计类似的表,使用一个标示字段来记录不同类型的数据。

变量的值存储
前面提到变量的值存储在zvalue_value联合体中,结构体定义如下:

复制代码 代码如下:


typedef union _zvalue_value {
    long lval; /* long value */
    double dval; /* double value */
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht; /* hash table value */
    zend_object_value obj;
} zvalue_value;

这里使用联合体而不是用结构体是出于空间利用率的考虑,因为一个变量同时只能属于一种类型。 如果使用结构体的话将会不必要的浪费空间,而PHP中的所有逻辑都围绕变量来进行的,这样的话, 内存浪费将是十分大的。这种做法成本小但收益非常大。
各种类型的数据会使用不同的方法来进行变量值的存储,其对应赋值方式如下:

1. 一般类型

变量类型 宏 ?

boolean ZVAL_BOOL 布尔型/整型的变量值存储于(zval).value.lval中,其类型也会以相应的IS_*进行存储。
Z_TYPE_P(z)=IS_BOOL/LONG; Z_LVAL_P(z)=((b)!=0);

integer ZVAL_LONG

float ZVAL_DOUBLE

null ZVAL_NULL NULL值的变量值不需要存储,只需要把(zval).type标为IS_NULL。
Z_TYPE_P(z)=IS_NULL;

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)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu 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)

Bagaimana untuk menukar jenis rangkaian kepada peribadi atau awam dalam Windows 11 Bagaimana untuk menukar jenis rangkaian kepada peribadi atau awam dalam Windows 11 Aug 24, 2023 pm 12:37 PM

Menyediakan rangkaian wayarles adalah perkara biasa, tetapi memilih atau menukar jenis rangkaian boleh mengelirukan, terutamanya jika anda tidak tahu akibatnya. Jika anda sedang mencari nasihat tentang cara menukar jenis rangkaian daripada awam kepada peribadi atau sebaliknya dalam Windows 11, baca terus untuk mendapatkan beberapa maklumat berguna. Apakah profil rangkaian yang berbeza dalam Windows 11? Windows 11 dilengkapi dengan beberapa profil rangkaian, yang pada asasnya merupakan set tetapan yang boleh digunakan untuk mengkonfigurasi pelbagai sambungan rangkaian. Ini berguna jika anda mempunyai berbilang sambungan di rumah atau pejabat supaya anda tidak perlu menyediakan semuanya setiap kali anda menyambung ke rangkaian baharu. Profil rangkaian peribadi dan awam ialah dua jenis biasa dalam Windows 11, tetapi secara amnya

Melaksanakan tatasusunan dinamik dalam Python: dari pemula hingga mahir Melaksanakan tatasusunan dinamik dalam Python: dari pemula hingga mahir Apr 21, 2023 pm 12:04 PM

Bahagian 1 Mari kita bincangkan tentang sifat jenis jujukan Python Dalam blog ini, mari kita bincangkan tentang pelbagai kelas "jujukan" Python dan tiga struktur data terbina dalam yang biasa digunakan - senarai, tuple dan sifat kelas rentetan (str ). Saya tidak tahu sama ada anda perasan, tetapi kelas ini mempunyai persamaan yang jelas. Mereka boleh digunakan untuk menyimpan berbilang elemen data. seperti menggunakan SyntaxSeq[i]​. Malah, setiap kelas di atas diwakili oleh struktur data mudah seperti tatasusunan. Walau bagaimanapun, pembaca yang biasa dengan Python mungkin tahu bahawa ketiga-tiga struktur data ini mempunyai beberapa perbezaan: contohnya, tupel dan rentetan tidak boleh diubah suai, manakala senarai boleh.

Bagaimana untuk membuat akaun matriks video? Apakah jenis akaun matriks yang ada padanya? Bagaimana untuk membuat akaun matriks video? Apakah jenis akaun matriks yang ada padanya? Mar 21, 2024 pm 04:57 PM

Dengan populariti platform video pendek, pemasaran akaun matriks video telah menjadi kaedah pemasaran yang baru muncul. Dengan mencipta dan mengurus berbilang akaun pada platform yang berbeza, perniagaan dan individu boleh mencapai matlamat seperti promosi jenama, pertumbuhan peminat dan jualan produk. Artikel ini akan membincangkan cara menggunakan akaun matriks video dengan berkesan dan memperkenalkan pelbagai jenis akaun matriks video. 1. Bagaimana untuk membuat akaun video matriks? Untuk membuat akaun matriks video yang baik, anda perlu mengikuti langkah berikut: Pertama, anda mesti menjelaskan matlamat akaun matriks video anda, sama ada untuk komunikasi jenama, pertumbuhan peminat atau jualan produk. Mempunyai matlamat yang jelas membantu membangunkan strategi dengan sewajarnya. 2. Pilih platform: Pilih platform video pendek yang sesuai berdasarkan khalayak sasaran anda. Platform video pendek arus perdana termasuk Douyin, Kuaishou, Huoshan Video, dsb.

Apakah jenis nilai pulangan fungsi Golang? Apakah jenis nilai pulangan fungsi Golang? Apr 13, 2024 pm 05:42 PM

Fungsi Go boleh mengembalikan berbilang nilai jenis yang berbeza Jenis nilai pulangan ditentukan dalam tandatangan fungsi dan dikembalikan melalui penyata pulangan. Sebagai contoh, fungsi boleh mengembalikan integer dan rentetan: funcgetDetails()(int,string). Dalam amalan, fungsi yang mengira luas bulatan boleh mengembalikan kawasan dan ralat pilihan: funccircleArea(radiusfloat64)(float64,error). Nota: Jika tandatangan fungsi tidak menyatakan jenis, nilai nol dikembalikan; adalah disyorkan untuk menggunakan penyataan pulangan dengan pengisytiharan jenis eksplisit untuk meningkatkan kebolehbacaan.

Penerokaan mendalam tentang lokasi penyimpanan dan mekanisme pembolehubah Golang Penerokaan mendalam tentang lokasi penyimpanan dan mekanisme pembolehubah Golang Feb 28, 2024 pm 09:45 PM

Tajuk: Penerokaan mendalam tentang lokasi storan dan mekanisme pembolehubah Golang Memandangkan aplikasi bahasa Go (Golang) semakin meningkat dalam bidang pengkomputeran awan, data besar dan kecerdasan buatan, adalah penting untuk mempunyai in- pemahaman mendalam tentang lokasi penyimpanan dan mekanisme pembolehubah Golang. Dalam artikel ini, kita akan membincangkan secara terperinci peruntukan memori, lokasi penyimpanan dan mekanisme berkaitan pembolehubah di Golang. Melalui contoh kod khusus, ia membantu pembaca lebih memahami cara pembolehubah Golang disimpan dan diurus dalam ingatan. 1.Memori pembolehubah Golang

Amalan terbaik untuk petunjuk jenis dalam Python Amalan terbaik untuk petunjuk jenis dalam Python Apr 23, 2023 am 09:28 AM

Menggunakan bahasa dinamik adalah menyeronokkan untuk seketika, dan kod itu dibina semula di krematorium. Saya percaya anda pasti pernah mendengar ayat ini Seperti ujian unit, walaupun memerlukan sedikit masa untuk menulis kod, ia sangat berbaloi untuk jangka masa panjang. Artikel ini berkongsi cara untuk lebih memahami dan menggunakan pembayang jenis Python. 1. Pembayang jenis hanya sah pada peringkat sintaks (diperkenalkan sejak PEP3107) digunakan untuk menambah jenis pada pembolehubah, parameter, parameter fungsi dan nilai pulangannya, sifat kelas dan kaedah. Jenis pembolehubah Python adalah dinamik dan boleh diubah suai semasa runtime untuk menambah petunjuk jenis pada kod tersebut hanya disokong pada tahap sintaks dan tidak mempunyai kesan ke atas jalankan kod tersebut. Oleh itu jenis

Apakah platform media kendiri utama? Apakah jenis platform media kendiri? Apakah platform media kendiri utama? Apakah jenis platform media kendiri? Mar 21, 2024 pm 06:36 PM

Dengan perkembangan pesat Internet, media kendiri telah menjadi saluran penting untuk penyebaran maklumat. Platform media kami menyediakan pentas untuk individu dan syarikat mempamerkan diri mereka dan menyebarkan maklumat. Pada masa ini, platform media kendiri utama di pasaran termasuk akaun rasmi WeChat, Toutiao, Berita Yidian, Platform Media Penguin, dll. Setiap platform ini mempunyai ciri tersendiri dan menyediakan banyak ruang kreatif untuk pengamal media kendiri. Seterusnya, kami akan memperkenalkan platform ini secara terperinci dan meneroka jenis platform media kendiri. 1. Apakah platform media kendiri utama? Akaun rasmi WeChat ialah platform media kendiri yang dilancarkan oleh Tencent untuk menyediakan perkhidmatan pelepasan dan penyebaran maklumat untuk pengguna individu dan korporat. Ia terbahagi kepada dua jenis: akaun perkhidmatan dan akaun langganan Akaun perkhidmatan terutamanya menyediakan perkhidmatan untuk perusahaan, manakala akaun langganan memfokuskan pada penyebaran maklumat. Bergantung kepada

Jenis dan ciri fungsi C++ Jenis dan ciri fungsi C++ Apr 11, 2024 pm 03:30 PM

Fungsi C++ mempunyai jenis berikut: fungsi ringkas, fungsi const, fungsi statik dan fungsi maya termasuk: fungsi sebaris, parameter lalai, pulangan rujukan dan fungsi terlampau beban; Sebagai contoh, fungsi calculateArea menggunakan π untuk mengira luas bulatan jejari tertentu dan mengembalikannya sebagai output.

See all articles