PHP ist ein schwach typisiertes, dynamisches Sprachskript. Wenn Sie eine Variable deklarieren, müssen Sie den Datentyp, den sie speichert, nicht angeben. Beispiel:
<?php $var = 1; $var = "variable"; $var = 1.00; $var = array(); $var = new Object();
Dynamische Variablen können zur Laufzeit geändert werden und es ist nicht erforderlich, den Variablentyp vor der Verwendung zu deklarieren.
Frage 1. Wie implementiert die Zend-Engine diesen schwachen Typ in C?
Tatsächlich werden in PHP deklarierte Variablen in ZE unter Verwendung der Struktur zval gespeichert.
Zuerst öffnen wir Zend/zend.h, um die Definition von zval zu sehen:
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;
Aus dem obigen Code: Sie können sehen, dass _zvalue_value der Schlüsselteil ist, der die Daten tatsächlich speichert. Schwache Typvariablendeklaration, implementiert durch Union
Frage 2: Wie identifiziert und speichert die Zend-Engine mehrere Datentypen in PHP?
_zval_struct.type speichert den tatsächlichen Typ einer Variablen. Abhängig vom Typ können Sie auswählen, wie Sie den Wert von zvalue_value erhalten.
Typwertliste (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
Schauen wir uns ein einfaches Beispiel an:
<?php $a = 1; //此时zval.type = IS_LONG,那么zval.value就去取lval. $a = array(); //此时zval.type = IS_ARRAY,那么zval.value就去取ht.
Der komplexeste davon, der häufig bei der Entwicklung von Erweiterungen von Drittanbietern verwendet wird, ist der „Ressourcentyp“.
In PHP wird jede Variable, die nicht zum integrierten Variablentyp von PHP gehört, gespeichert als Ressource.
Zum Beispiel: Datenbank-Handle, offenes Datei-Handle, offenes Socket-Handle.
Der Ressourcentyp verwendet zu diesem Zeitpunkt lval, was ein ganzzahliger Indikator ist. Dann fragt PHP eine in PHP erstellte Ressourcenliste basierend auf diesem Indikator ab.
Gerade aufgrund der Verarbeitungsmethode von ZE implementiert PHP schwache Typen, und für ZE steht immer derselbe Typ zur Verfügung.