Inhaltsverzeichnis
PHP变量在zend内核中的存储方式
Heim Backend-Entwicklung PHP-Tutorial PHP变量在zend内核中的存储方式_PHP教程

PHP变量在zend内核中的存储方式_PHP教程

Jul 13, 2016 am 09:45 AM
Kernel 变量 方式

PHP变量在zend内核中的存储方式

PHP中的变量可以保存任何的数据类型,这是因为它是弱类型语言。但php是用C语言编写的,C语言是强类型语言,每个变量都有固定的类型,不能随意改变变量的类型(可以通过强制类型转变,不过有可能出现问题),在zend引擎中是怎样可以做到一个变量保存任何类型的呢?
在zend/zend.h头文件中,会发现下面的结构体:

<code>typedef struct _zval_struct zval;

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

struct _zval_struct {
    zvalue_value value;
    zend_uint refcount;
    zend_uchar type;
    zend_uchar is_ref;
};
</code>
Nach dem Login kopieren

zval结构体就是通常用到的PHP变量在内核中的表达方式。在zval结构体中,可以看到4个成员变量,分别是:

<code>zvalue_value value;  //变量的值,PHP变量的值就保存在这里
zend_uint refcount;  //变量引用数,变量引用计算器
zend_uchar type;     //变量的类型
zend_uchar is_ref;   //变量是否被引用
</code>
Nach dem Login kopieren

zval结构体的value成员变量是一个zvalue_value联合体,PHP能够保持任何的结构类型就是因为这个联合体 。从zvalue_value联合体的成员变量中可以看到,不同类型会保存到不同的成员变量中,这样就实现了PHP变量可以存储任何数据类型。例如,当变量是整数类型时,会保存到value的lval成员变量中;当变量的类型是字符串时,又会保存到value的str成员变量中。

不同类型对应的成员变量
还有一个问题,就是zend引擎是怎么知道这个变量保存的是什么类型呢?我们注意到,zval结构体中有个type成员变量,这个成员变量就是要保存一个php变量的类型。
zend引擎定义了8中变量类型:

<code>#define IS_NULL 0
#define IS_LONG 1
#define IS_DOUBLE 2
#define IS_STRING 3
#define IS_ARRAY 4
#define IS_OBJECT 5
#define IS_BOOL 6
#define IS_RESOURCE 7
</code>
Nach dem Login kopieren

每一个宏定义对应php语言层的一种类型,例如当zval的type成员变量等于IS_STRING时(zval.type==IS_STRING),说明这个变量的类型是字符串类型。

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1043340.htmlTechArticlePHP变量在zend内核中的存储方式 PHP中的变量可以保存任何的数据类型,这是因为它是弱类型语言。但php是用C语言编写的,C语言是强类型语言...
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Eine Anleitung zur Verwendung von Windows 11- und 10-Umgebungsvariablen für die Profilerstellung Eine Anleitung zur Verwendung von Windows 11- und 10-Umgebungsvariablen für die Profilerstellung Nov 01, 2023 pm 08:13 PM

Eine Anleitung zur Verwendung von Windows 11- und 10-Umgebungsvariablen für die Profilerstellung

So installieren Sie den Linux-Kernel unter Ubuntu 22.04 Detailliertes Tutorial! So installieren Sie den Linux-Kernel unter Ubuntu 22.04 Detailliertes Tutorial! Mar 01, 2024 pm 10:34 PM

So installieren Sie den Linux-Kernel unter Ubuntu 22.04 Detailliertes Tutorial!

Ändern Sie die Startsequenz des Linux-Kernels Ändern Sie die Startsequenz des Linux-Kernels Feb 23, 2024 pm 10:22 PM

Ändern Sie die Startsequenz des Linux-Kernels

Strikter Modus für Variablen in PHP7: Wie können potenzielle Fehler reduziert werden? Strikter Modus für Variablen in PHP7: Wie können potenzielle Fehler reduziert werden? Oct 19, 2023 am 10:01 AM

Strikter Modus für Variablen in PHP7: Wie können potenzielle Fehler reduziert werden?

Einführung in die PHP-Funktion – is_string(): Überprüfen Sie, ob die Variable eine Zeichenfolge ist Einführung in die PHP-Funktion – is_string(): Überprüfen Sie, ob die Variable eine Zeichenfolge ist Jul 24, 2023 pm 09:33 PM

Einführung in die PHP-Funktion – is_string(): Überprüfen Sie, ob die Variable eine Zeichenfolge ist

Was sind Instanzvariablen in Java? Was sind Instanzvariablen in Java? Feb 19, 2024 pm 07:55 PM

Was sind Instanzvariablen in Java?

Wie erhalte ich Variablen aus der PHP-Methode mit Ajax? Wie erhalte ich Variablen aus der PHP-Methode mit Ajax? Mar 09, 2024 pm 05:36 PM

Wie erhalte ich Variablen aus der PHP-Methode mit Ajax?

Mindmap der Python-Syntax: Vertiefendes Verständnis der Codestruktur Mindmap der Python-Syntax: Vertiefendes Verständnis der Codestruktur Feb 21, 2024 am 09:00 AM

Mindmap der Python-Syntax: Vertiefendes Verständnis der Codestruktur

See all articles