Heim php教程 php手册 php 全局变量:PHP源码分析-弱类型变量实现

php 全局变量:PHP源码分析-弱类型变量实现

Jun 21, 2016 am 08:50 AM
define typedef zend zval


PHP是弱类型,动态的语言脚本。在申明一个变量的时候,并不需要指明它保存的数据类型。
例如:
$var = 1;
$var = "variable";
$var = 1.00;
$var = array();
$var = new Object();
动态变量,在运行期间是可以改变的,并且在使用前无需声明变量类型。
那么,问题一、Zend引擎是如何用C实现这种弱类型的呢?
实际上,在PHP中声明的变量,在ZE中都是用结构体zval来保存的。
首先我们打开Zend/zend.h来看zval的定义:
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;
};
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;
Zend/zend_types.h:
typedef unsigned char zend_bool;
typedef unsigned char zend_uchar;
typedef unsigned int zend_uint;
typedef unsigned long zend_ulong;
typedef unsigned short zend_ushort;
从上述代码中,可以看到_zvalue_value是真正保存数据的关键部分。通过共用体实现的弱类型变量声明
问题二、Zend引擎是如何判别、存储PHP中的多种数据类型的呢?
_zval_struct.type中存储着一个变量的真正类型,根据type来选择如何获取zvalue_value的值。
type值列表(Zend/zend.h):
#define IS_NULL 0
#define IS_LONG 1
#define IS_DOUBLE 2
#define IS_BOOL 3
#define IS_ARRAY 4
#define IS_OBJECT 5
#define IS_STRING 6
#define IS_RESOURCE 7
#define IS_CONSTANT 8
#define IS_CONSTANT_ARRAY 9
来看一个简单的例子:
$a = 1;
//此时zval.type = IS_LONG,那么zval.value就去取lval.
$a = array();
//此时zval.type = IS_ARRAY,那么zval.value就去取ht.
这其中最复杂的,并且在开发第三方扩展中经常需要用到的是"资源类型".
在PHP中,任何不属于PHP的内建的变量类型的变量,都会被看作资源来进行保存。 本文链接http://www.cxybl.com/html/wlbc/Php/20121213/34971.html



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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

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)

Verwendung der Typedef-Struktur in der C-Sprache Verwendung der Typedef-Struktur in der C-Sprache May 09, 2024 am 10:15 AM

typedef struct wird in der C-Sprache zum Erstellen von Strukturtypaliasen verwendet, um die Verwendung von Strukturen zu vereinfachen. Es weist einem neuen Datentyp ein Alias ​​auf eine vorhandene Struktur zu, indem es den Strukturalias angibt. Zu den Vorteilen gehören verbesserte Lesbarkeit, Wiederverwendung von Code und Typprüfung. Hinweis: Die Struktur muss vor der Verwendung eines Alias ​​definiert werden. Der Alias ​​muss im Programm eindeutig sein und nur innerhalb des Bereichs gültig sein, in dem er deklariert ist.

Was ist die Verwendung von typedef Was ist die Verwendung von typedef Sep 04, 2023 pm 01:20 PM

Die Verwendung von typedef besteht darin, neue Aliase für vorhandene Datentypen zu erstellen. Die Verwendung von Typedefs kann die Lesbarkeit und Wartbarkeit Ihres Codes verbessern, insbesondere beim Umgang mit komplexen Datentypen. Bei einfachen Datentypen wie Ganzzahlen, Gleitkommazahlen oder Zeichen liegen die Vorteile der Verwendung von Aliasen nicht auf der Hand. Bei komplexen Datentypen wie Zeigern, Strukturen, Arrays und Funktionen liegen die Vorteile der Verwendung von Aliasen jedoch auf der Hand. Eine Typedef kann nicht vor einer Variablen- oder Funktionsdefinition verwendet werden und wird normalerweise am Anfang einer Programmdatei oder nach einer Strukturdefinition erstellt.

Verständnis der Speicherverwaltung von C++-Funktionszeigern: Zeigerfallen vermeiden Verständnis der Speicherverwaltung von C++-Funktionszeigern: Zeigerfallen vermeiden Apr 29, 2024 pm 09:03 PM

Bei der Verwendung von Funktionszeigern in C++ muss die Speicherverwaltung sorgfältig überlegt werden, um Fallstricke zu vermeiden. Zu diesen Traps gehören Dangling-Zeiger (die auf Funktionen außerhalb ihres Gültigkeitsbereichs zeigen) und Wild-Zeiger (Funktionszeiger, die niemals initialisiert oder auf nullptr gesetzt werden). Um diese Fallstricke zu vermeiden, befolgen Sie die folgenden Best Practices: Initialisieren Sie immer Funktionszeiger, verwalten Sie den Speicher sorgfältig und verwenden Sie intelligente Zeiger. Auf diese Weise können Sie Funktionszeiger sicher verwenden und vermeiden, in Zeigerfallen zu tappen.

Detaillierte Erläuterung des Linux-Kernel-Timers und der Verzögerungsarbeitstreiberentwicklung Detaillierte Erläuterung des Linux-Kernel-Timers und der Verzögerungsarbeitstreiberentwicklung Feb 13, 2024 am 11:57 AM

Linux-Kernel-Timer und Verzögerungsaufgaben sind zwei häufig verwendete Mechanismen zur Implementierung geplanter Aufgaben und verzögerter Ausführungsaufgaben. Sie ermöglichen es dem Treiber, bestimmte Funktionen zum richtigen Zeitpunkt auszuführen, um sie an die Anforderungen und Eigenschaften des Hardwaregeräts anzupassen. Aber wie nutzt man Linux-Kernel-Timer richtig, um mit Verzögerungen umzugehen? In diesem Artikel werden die grundlegenden Kenntnisse und Fähigkeiten der Entwicklung von Linux-Kernel-Timern und Verzögerungsarbeitstreibern aus theoretischer und praktischer Sicht sowie einige häufig auftretende Probleme und Lösungen vorgestellt. Der Timer der Kernel-Timer-Software basiert letztendlich auf der Hardware-Uhr. Der Kernel erkennt, ob jeder im Kernel registrierte Timer abgelaufen ist. Wenn er abläuft, ruft er die entsprechende Registrierungsfunktion auf dies als Unterbrechung zur unteren Hälfte. Wirklichkeit

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

So schreiben Sie einfachen Feuerwerkscode in C-Sprache So schreiben Sie einfachen Feuerwerkscode in C-Sprache Apr 13, 2024 pm 09:18 PM

Um einen einfachen Feuerwerkscode in C zu schreiben, müssen Sie die folgenden Schritte ausführen: Header-Dateien und Bibliotheken einbinden. Definieren Sie Konstanten und Makros. Erstellen Sie eine Partikeldatenstruktur. Globale Variablen deklarieren. Initialisieren Sie die Feuerwerkspartikel in der Funktion main(). Aktualisieren Sie die Position und Geschwindigkeit des Partikels in der Spielschleife und zeichnen Sie sie. Suchen und vernichten Sie Partikel, die das Ende ihrer Lebensdauer erreicht haben.

Der Unterschied zwischen typedef struct und struct in C++ Der Unterschied zwischen typedef struct und struct in C++ May 01, 2024 am 11:36 AM

Der Unterschied zwischen typedef struct und struct: typedef struct erstellt einen Alias ​​eines Strukturtyps, während struct einen neuen Strukturtyp definiert. Der durch typedef struct erstellte Alias ​​kann nach der Deklaration verwendet werden, während die durch struct definierte Struktur nach der Definition verwendet werden kann. Weder typedef struct noch struct erzeugen zusätzlichen Speicherplatz.

See all articles