In diesem Artikel werden hauptsächlich die relevanten Kenntnisse der PHP-Variablenstruktur vorgestellt. Der Artikel erwähnt zval in PHP5 und zval in PHP 7. Der Code ist einfach und leicht zu verstehen.
zval in PHP5
// 1. zval typedef struct _zval_struct { zvalue_value value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc; } zval; // 2. zvalue_value typedef union _zvalue_value { long lval; // 用于 bool 类型、整型和资源类型 double dval; // 用于浮点类型 struct { // 用于字符串 char *val; int len; } str; HashTable *ht; // 用于数组 zend_object_value obj; // 用于对象 zend_ast *ast; // 用于常量表达式(PHP5.6 才有) } zvalue_value; // 3. zend_object_value typedef struct _zend_object_value { zend_object_handle handle; const zend_object_handlers *handlers; } zend_object_value; // 4. zend_object_handle typedef unsigned int zend_object_handle;
In den meisten Artikeln wird bei der Erwähnung der PHP5-Variablenstruktur Folgendes erwähnt: sizeof (zval) == 24, sizeof(zvalue_value) == 16. Tatsächlich ist diese Aussage nicht korrekt. Wenn die CPU 64 Bit ist, ist dieses Ergebnis korrekt.
Aber wenn die CPU 32 Bit ist: sizeof(zval) == 16, sizeof(zvalue_value) == 8, hauptsächlich weil bei einer 64-Bit-CPU der Zeiger 8 Bytes belegt und bei einer 32-Bit-CPU Der Zeiger ist 4 Bytes groß.
zval in PHP 7
// 1. 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 */ } u2; }; // 2. zend_value typedef union _zend_value { zend_long lval; /* long value */ double dval; /* double value */ 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;
Es scheint viele davon in PHP zu geben 7, aber tatsächlich ist es noch einfacher: Egal ob die CPU 32 Bit oder 64 Bit ist, sizeof (zval) ist immer gleich 16.
Schauen Sie sich hauptsächlich das WW in zend_value an, das zwei uint32_t ist. Dies sind immer 8 Bytes, also sizeof(zend_value) == 8, also sizeof(zval) == 16.
In Bezug auf die Speichereinsparung, die in den neuen Funktionen von PHP7 erwähnt wird, gibt es in 32-Bit-Systemen bei PHP5 => PHP7 keine Änderung.
sizeof kann übrigens nicht als Funktion betrachtet werden. Obwohl es wie eine Funktion geschrieben ist, wird der Wert zur Kompilierungszeit und nicht zur Laufzeit bestimmt. Ähnlich wie bei der Kompilierungsvorverarbeitung.
Zusammenfassung
Das obige ist der detaillierte Inhalt vonVertiefendes Verständnis der PHP-Variablenstruktur. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!