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

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

Jun 13, 2016 pm 12:23 PM
define zend zval

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),说明这个变量的类型是字符串类型。

版权声明:本文为博主原创文章,未经博主允许不得转载。

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 KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

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)

defineSo definieren Sie mehrzeilige Makros defineSo definieren Sie mehrzeilige Makros Oct 11, 2023 pm 01:24 PM

define definiert ein mehrzeiliges Makro, indem es „do { \ printf("%d\n", x \ } while (0)“ zur Definition in mehrere Zeilen aufteilt. In einer Makrodefinition muss der Backslash „\“ das letzte Zeichen der Makrodefinition sein und darf weder Leerzeichen noch Kommentare enthalten. Wenn Sie „\“ zur Zeilenfortsetzung verwenden, achten Sie darauf, dass der Code lesbar bleibt und stellen Sie sicher, dass am Ende jeder Zeile ein „\“ steht.

Entdecken Sie die Bedeutung und Rolle der Definitionsfunktion in PHP Entdecken Sie die Bedeutung und Rolle der Definitionsfunktion in PHP Mar 19, 2024 pm 12:12 PM

Die Bedeutung und Rolle der Definitionsfunktion in PHP 1. Grundlegende Einführung in die Definitionsfunktion In PHP ist die Definitionsfunktion eine Schlüsselfunktion zum Definieren von Konstanten. Konstanten ändern ihre Werte während der Ausführung des Programms nicht. Mit der Funktion „Definieren“ definierte Konstanten können im gesamten Skript aufgerufen werden und sind global. 2. Die Syntax der Definitionsfunktion Die grundlegende Syntax der Definitionsfunktion lautet wie folgt: define("Konstantenname",Konstantenwert&qu

PHP-Implementierungs-Framework: Zend Framework-Erste-Schritte-Tutorial PHP-Implementierungs-Framework: Zend Framework-Erste-Schritte-Tutorial Jun 19, 2023 am 08:09 AM

PHP-Implementierungsframework: ZendFramework-Einführungs-Tutorial ZendFramework ist ein von PHP entwickeltes und derzeit von ZendTechnologies verwaltetes Open-Source-Website-Framework, das das MVC-Designmuster übernimmt und eine Reihe wiederverwendbarer Codebibliotheken zur Implementierung von Web2.0-Anwendungen und Web Serve bereitstellt. ZendFramework ist bei PHP-Entwicklern sehr beliebt und geschätzt und bietet eine große Auswahl an

So verwenden Sie ACL (Access Control List) zur Berechtigungskontrolle im Zend Framework So verwenden Sie ACL (Access Control List) zur Berechtigungskontrolle im Zend Framework Jul 29, 2023 am 09:24 AM

So verwenden Sie ACL (AccessControlList) zur Berechtigungskontrolle im Zend Framework. Einführung: In einer Webanwendung ist die Berechtigungskontrolle eine entscheidende Funktion. Es stellt sicher, dass Benutzer nur auf die Seiten und Funktionen zugreifen können, für die sie eine Zugriffsberechtigung haben, und verhindert unbefugten Zugriff. Das Zend-Framework bietet eine praktische Möglichkeit, die Berechtigungskontrolle mithilfe der ACL-Komponente (AccessControlList) zu implementieren. In diesem Artikel wird die Verwendung von ACL im Zend Framework vorgestellt

Wie speichert PHP Variablen? Verstehen Sie die Zval-Struktur? Wie speichert PHP Variablen? Verstehen Sie die Zval-Struktur? May 26, 2022 am 09:47 AM

Beim Definieren einer Variablen in PHP ist es nicht erforderlich, einen Typ zu deklarieren. Sie weisen der Variablen $a zunächst einen ganzzahligen Wert zu und können ihn später problemlos in andere Typen ändern. Wie wird diese Variable $a im PHP-Quellcode gespeichert? Mit dieser Frage im Hinterkopf werfen wir einen Blick auf den Quellcode von PHP.

defineSo definieren Sie die bedingte Kompilierung defineSo definieren Sie die bedingte Kompilierung Oct 11, 2023 pm 01:20 PM

Die defineConditional-Kompilierung kann mithilfe der Vorverarbeitungsanweisungen „#ifdef“, „#ifndef“, „#if“, „#elif“, „#else“ und „#endif“ erreicht werden.

Definieren Sie die Verwendung des Funktionsmakros Definieren Sie die Verwendung des Funktionsmakros Oct 11, 2023 pm 12:00 PM

Verwendung des Definitionsfunktionsmakros: 1. Definieren Sie ein einfaches Berechnungsmakro, „#define SQUARE(x) ((x) * (x))“ 2. Definieren Sie ein Makro mit mehreren Parametern, „#define MAX(a , b)“ ((a) > (b) ? (a) : (b))“; 3. Definieren Sie Makros mit komplexen Ausdrücken, „#define ABS(x) ((x) < 0 ? -(x ) : (x)) “.

Der Unterschied zwischen typedef und define Der Unterschied zwischen typedef und define Sep 26, 2023 am 10:41 AM

Der Unterschied zwischen typedef und define liegt in der Typprüfung, dem Umfang, der Lesbarkeit, der Fehlerbehandlung, der Speichernutzung usw. Detaillierte Einführung: 1. Typprüfung: Der durch typedef definierte Typalias ist ein echter Typ und es wird eine Typprüfung durchgeführt, während das durch define definierte Makro nur eine einfache Textersetzung ist und keine Typprüfung durchgeführt wird , der durch typedef definierte Typalias ist lokal und nur innerhalb des aktuellen Bereichs gültig, während das durch define definierte Makro global ist und überall verwendet werden kann 3. Lesbarkeit usw.

See all articles