Heim > Backend-Entwicklung > PHP-Tutorial > Vertiefendes Verständnis der PHP-Variablenstruktur

Vertiefendes Verständnis der PHP-Variablenstruktur

黄舟
Freigeben: 2023-03-16 15:32:01
Original
3078 Leute haben es durchsucht

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage