Inhaltsverzeichnis
Grundstruktur von Variablen
Zval-Implementierung
Vergleich der zval-Struktur von PHP5 und PHP7
Gemeinsame Variablentypen
Ganzzahlen und Gleitkommatypen
Strings
Heim Backend-Entwicklung PHP7 Beherrschen Sie die Grundvariablen von PHP7

Beherrschen Sie die Grundvariablen von PHP7

Nov 17, 2020 pm 04:40 PM
php7

In der Spalte

PHP7 werden verwandte Basisvariablen vorgestellt.

Beherrschen Sie die Grundvariablen von PHP7

Grundstruktur von Variablen

Wir alle wissen, dass PHP-Variablen schwach typisiert sind und es nicht erforderlich ist, den Typ bei der Deklaration anzugeben. Wie wird das umgesetzt? Dies muss mit der Grundstruktur von Variablen beginnen.

Zval-Implementierung

In der Quellcodedatei zend_type.h können Sie die Definition von zval sehen:

typedef struct _zval_struct     zval;struct _zval_struct {
	zend_value        value;			/* value */
	union {		struct {
			ZEND_ENDIAN_LOHI_4(
				zend_uchar    type,			/* active type */
				zend_uchar    type_flags,
				zend_uchar    const_flags,
				zend_uchar    reserved)	    /* call info for EX(This) */
		} v;		uint32_t type_info;
	} u1;	union {		uint32_t     next;                 /* hash collision chain */
		uint32_t     cache_slot;           /* literal cache slot */
		uint32_t     lineno;               /* line number (for ast nodes) */
		uint32_t     num_args;             /* arguments number for EX(This) */
		uint32_t     fe_pos;               /* foreach position */
		uint32_t     fe_iter_idx;          /* foreach iterator index */
		uint32_t     access_flags;         /* class constant access flags */
		uint32_t     property_guard;       /* single property guard */
		uint32_t     extra;                /* not further specified */
	} u2;
}复制代码
Nach dem Login kopieren

Die Struktur von zval besteht aus einer Union Union zend_value, die den Wert oder Zeiger des Variablentyps speichert, und zwei Union Unions u1 und u2 bestehen aus

  • u1

u1 wird zum Speichern von Variablentypen und deren Informationen verwendet. Die darin enthaltenen Felder werden wie folgt verwendet:

Typ: Variablentypen aufzeichnen. Sie können über u2.v.type auf

type_flags zugreifen: die Flags, die den eindeutigen Variablentypen entsprechen (z. B. Konstantentypen, Referenzzähltypen, unveränderliche Typen).

const_flags: konstante Typflags

reserved: reservierte Felder

  • u2

u2 ist hauptsächlich eine Hilfsfunktion der Struktur, die den Raum von u2 mit oder ohne u2 bereits belegt hat. , also nutzen Sie es. Das Hilfsfeld von u2 zeichnet viele Typinformationen auf, was für interne Funktionen von großem Nutzen ist, die Cache-Freundlichkeit verbessert oder Speicheradressierungsvorgänge reduziert. Einige dieser Bereiche werden hier vorgestellt.

next: Wird verwendet, um das Hash-Konfliktproblem zu lösen (der Hash-Konflikt wurde noch nicht verstanden) und die Position des nächsten Elements des Konflikts aufzuzeichnen.

cache_slot: Laufzeitcache. Beim Ausführen einer Funktion wird zunächst im Cache gesucht. Wenn sie nicht im Cache gefunden wird, wird anschließend in der globalen Funktionstabelle gesucht.

num_args: Die Anzahl der Parameter, die beim Aufruf der Funktion übergeben werden.

access_flags: Das Zugriffsflag der Objektklasse, z. B. public protected private.

  • zend_value
typedef union _zend_value {
	zend_long         lval;				/* 整型*/
	double            dval;				/* 浮点型 */
	zend_refcounted  *counted;
	zend_string      *str;
	zend_array       *arr;
	zend_object      *obj;
	zend_resource    *res;
	zend_reference   *ref;
	zend_ast_ref     *ast;
	zval             *zv;	void             *ptr;
	zend_class_entry *ce;
	zend_function    *func;	struct {
		uint32_t w1;		uint32_t w2;
	} ww;
} zend_value;复制代码
Nach dem Login kopieren

Wie aus zend__value ersichtlich ist, speichern Long- und Double-Typen Werte direkt, während andere Typen Zeiger sind und auf ihre jeweiligen Strukturen zeigen. Aufgrund der Struktur von zval müssen PHP-Variablen daher bei der Deklaration ihren Typ nicht explizit angeben, da sie Ihnen dabei helfen können, die entsprechende Speicherstruktur zu finden, unabhängig davon, welchen Werttyp Sie der Variablen zuweisen.

Nehmen Sie als Beispiel eine Variable mit einem Zeichenfolgenwert. Ihre Struktur ist wie folgt:

Beherrschen Sie die Grundvariablen von PHP7

Vergleich der zval-Struktur von PHP5 und PHP7

  • PHP5
Beherrschen Sie die Grundvariablen von PHP7
  • PHP 7
Beherrschen Sie die Grundvariablen von PHP7

Sie können sehen, dass der Zval von PHP7 insgesamt nur 16 Bytes belegt, was im Vergleich zu den 48 Bytes von ZVAL von PHP5 viel Speicher spart.

Darüber hinaus werden in PHP5 alle Variablen im Heap zugewiesen, für temporäre Variablen besteht jedoch keine Notwendigkeit, sie im Heap zuzuweisen. Daher wurde dies in PHP7 optimiert und temporäre Variablen werden direkt auf dem Stack angewendet.

Gemeinsame Variablentypen

Im Folgenden werden einige gängige Typen von Variablenstrukturen vorgestellt. Für weitere andere Typen können Sie den Quellcode selbst anzeigen.

Ganzzahlen und Gleitkommatypen

Bei Ganzzahlen und Gleitkommatypen werden Ganzzahlwerte aufgrund ihres geringen Platzbedarfs direkt in zval und in lval gespeichert, während Gleitkommawerte in dval gespeichert werden . .

typedef union _zend_value {
    zend_long         lval;             /* 整型*/
    double            dval;             /* 浮点型 */
    ... 
 }复制代码
Nach dem Login kopieren

Strings

Eine neue String-Struktur ist in PHP 7 definiert. Die Struktur ist wie folgt:

struct _zend_string {
	zend_refcounted_h ;
	zend_ulong        h;                /* hash value */
	size_t            len;	char              val[1];
};复制代码
Nach dem Login kopieren

Die Bedeutung jedes Feldes oben:

gc: Variablenreferenzinformationen, alle Variablentypen, die Referenzzählung verwenden, haben diese Struktur.

h: Hash-Wert, der bei der Berechnung des Index im Array verwendet wird. (Es wird gesagt, dass dieser Vorgang die Leistung von PHP7 um 5% verbessert.)

len: String-Länge, binäre Sicherheit wird durch diesen Wert gewährleistet.

val: String-Inhalt, Struktur variabler Länge, bei der Zuweisung gilt entsprechend Speicher Len-Länge Array

array ist eine sehr leistungsfähige Datenstruktur in PHP. Die zugrunde liegende Implementierung ist eine gewöhnliche geordnete HashTable. Hier ist ein kurzer Blick auf ihre Struktur. Weitere Einzelheiten folgen später.

typedef struct _zend_array HashTable;struct _zend_array {
	zend_refcounted_h gc;	union {		struct {
			ZEND_ENDIAN_LOHI_4(
				zend_uchar    flags,
				zend_uchar    nApplyCount,
				zend_uchar    nIteratorsCount,
				zend_uchar    consistency)
		} v;		uint32_t flags;
	} u;	uint32_t          nTableMask;
	Bucket           *arData;	uint32_t          nNumUsed;	uint32_t          nNumOfElements;	uint32_t          nTableSize;	uint32_t          nInternalPointer;
	zend_long         nNextFreeElement;	dtor_func_t       pDestructor;
}复制代码
Nach dem Login kopieren

###Objekte

Die Objektstruktur von PHP7 wurde ebenfalls neu gestaltet, was sich stark von der Implementierung von PHP5 unterscheidet.

struct _zend_object {
    zend_refcounted_h gc;    uint32_t          handle;
    zend_class_entry *ce; 
    const zend_object_handlers *handlers;
    HashTable        *properties; 
    zval              properties_table[1];
};复制代码
Nach dem Login kopieren

Hier sind einige der Felder:

gc: gc-Header

*ce: Klasse, die dem Objekt entspricht

*properties: HashTable-Struktur, Schlüssel ist der Eigenschaftsname des Objekts, Wert ist der Eigenschaftswert im Properties_tables-Array Der Offset in. Finden Sie den entsprechenden Eigenschaftswert in Properties_talbe über den Offset.

properties_talbe[1]: Speichert die Attributwerte des Objekts

Kostenlose Empfehlung: PHP7

Das obige ist der detaillierte Inhalt vonBeherrschen Sie die Grundvariablen von PHP7. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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 尊渡假赌尊渡假赌尊渡假赌

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)

So lösen Sie das Problem, wenn PHP7 erkennt, dass der TCP-Port nicht funktioniert So lösen Sie das Problem, wenn PHP7 erkennt, dass der TCP-Port nicht funktioniert Mar 22, 2023 am 09:30 AM

In PHP5 können wir die Funktion fsockopen() verwenden, um den TCP-Port zu erkennen. Mit dieser Funktion können Sie eine Netzwerkverbindung herstellen und eine Netzwerkkommunikation durchführen. In PHP7 kann die Funktion fsockopen() jedoch auf einige Probleme stoßen, z. B. dass der Port nicht geöffnet werden kann, keine Verbindung zum Server hergestellt werden kann usw. Um dieses Problem zu lösen, können wir die Funktionen socket_create() und socket_connect() verwenden, um den TCP-Port zu erkennen.

Was soll ich tun, wenn das Plug-in in php7.0 installiert ist, aber immer noch angezeigt wird, dass es nicht installiert ist? Was soll ich tun, wenn das Plug-in in php7.0 installiert ist, aber immer noch angezeigt wird, dass es nicht installiert ist? Apr 02, 2024 pm 07:39 PM

So beheben Sie das Problem, dass das Plugin in PHP 7.0 nicht installiert ist: Überprüfen Sie die Plugin-Konfiguration und aktivieren Sie das Plugin. Starten Sie PHP neu, um die Konfigurationsänderungen zu übernehmen. Überprüfen Sie die Berechtigungen der Plugin-Datei, um sicherzustellen, dass sie korrekt sind. Installieren Sie fehlende Abhängigkeiten, um sicherzustellen, dass das Plugin ordnungsgemäß funktioniert. Wenn alle anderen Schritte fehlschlagen, erstellen Sie PHP neu. Weitere mögliche Ursachen sind inkompatible Plugin-Versionen, das Laden der falschen Version oder PHP-Konfigurationsprobleme.

So installieren Sie die Mongo-Erweiterung in PHP7.0 So installieren Sie die Mongo-Erweiterung in PHP7.0 Nov 21, 2022 am 10:25 AM

So installieren Sie die Mongo-Erweiterung in PHP7.0: 1. Erstellen Sie die Mongodb-Benutzergruppe und den Mongodb-Benutzer. 2. Laden Sie das Mongodb-Quellcodepaket herunter und platzieren Sie das Quellcodepaket im Verzeichnis „/usr/local/src/“. Geben Sie das Verzeichnis „src/“ ein. 4. Entpacken Sie das Quellcodepaket. 6. Kopieren Sie die Dateien in das Verzeichnis „mongodb/“.

So installieren und implementieren Sie PHP7.0 So installieren und implementieren Sie PHP7.0 Nov 30, 2022 am 09:56 AM

So installieren und implementieren Sie PHP7.0: 1. Gehen Sie zur offiziellen PHP-Website, um die dem lokalen System entsprechende Installationsversion herunterzuladen. 2. Extrahieren Sie die heruntergeladene ZIP-Datei in das angegebene Verzeichnis. 3. Öffnen Sie das Befehlszeilenfenster und gehen Sie zu das Verzeichnis „E:\php7“ Führen Sie einfach den Befehl „php -v“ aus.

FAQ-Leitfaden zur PHP-Serverumgebung: Häufige Probleme schnell lösen FAQ-Leitfaden zur PHP-Serverumgebung: Häufige Probleme schnell lösen Apr 09, 2024 pm 01:33 PM

Zu den gängigen Lösungen für PHP-Serverumgebungen gehört die Sicherstellung, dass die richtige PHP-Version installiert ist und relevante Dateien in das Modulverzeichnis kopiert wurden. Deaktivieren Sie SELinux vorübergehend oder dauerhaft. Überprüfen und konfigurieren Sie PHP.ini, um sicherzustellen, dass die erforderlichen Erweiterungen hinzugefügt und korrekt eingerichtet wurden. Starten oder starten Sie den PHP-FPM-Dienst neu. Überprüfen Sie die DNS-Einstellungen auf Auflösungsprobleme.

Was ist besser, PHP8 oder PHP7? Was ist besser, PHP8 oder PHP7? Nov 16, 2023 pm 03:09 PM

Im Vergleich zu PHP7 bietet PHP8 einige Vorteile und Verbesserungen in Bezug auf Leistung, neue Funktionen und Syntaxverbesserungen, Typsystem, Fehlerbehandlung und Erweiterungen. Die Wahl der zu verwendenden Version hängt jedoch von Ihren spezifischen Anforderungen und Projektumständen ab. Detaillierte Einführung: 1. Leistungsverbesserung: PHP8 führt den Just-in-Time-Compiler (JIT) ein, der die Ausführungsgeschwindigkeit des Codes verbessern kann. 2. Neue Funktionen und Syntaxverbesserungen. PHP8 unterstützt die Deklaration benannter Parameter und optionaler Parameter. Durch die flexiblere Gestaltung von Funktionen werden anonyme Klassen, Typdeklarationen von Eigenschaften usw. eingeführt.

Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Mar 31, 2025 pm 11:54 PM

So setzen Sie die Berechtigungen von Unixsocket automatisch nach dem Neustart des Systems. Jedes Mal, wenn das System neu startet, müssen wir den folgenden Befehl ausführen, um die Berechtigungen von Unixsocket: sudo ...

Zeichnen Sie einmal auf und verwenden Sie Strace, um das Problem zu diagnostizieren, dass PHP zu viele Systemressourcen belegt. Zeichnen Sie einmal auf und verwenden Sie Strace, um das Problem zu diagnostizieren, dass PHP zu viele Systemressourcen belegt. May 03, 2024 pm 04:31 PM

Lokale Umgebung: Redhat6.7-System. Nginx1.12.1, PHP7.1.0, der Code verwendet das Yii2-Framework-Problem: Die lokale Website muss den Elasticsearch-Dienst verwenden. Wenn PHP Elasticsearch verwendet, das auf einem lokalen Server erstellt wurde, ist die lokale Last normal. Wenn ich den Elasticsearch-Service von AWS nutze, ist die Auslastung des lokalen Servers oft zu hoch. Überprüfen Sie die Nginx- und PHP-Protokolle und finden Sie keine Ausnahmen. Auch die Anzahl gleichzeitiger Verbindungen im System ist nicht hoch. Zu diesem Zeitpunkt dachte ich an ein Strace-Diagnosetool, das mir unser Chef erzählt hatte. Debugging-Prozess: Finden Sie einen PHP-Unterprozess idstrace-

See all articles