Zval은 PHP에서 가장 중요한 데이터 구조 중 하나입니다. 여기에는 PHP의 변수 값과 유형에 대한 정보가 포함되어 있습니다.
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 var_flags; 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 */ } u2;};
zval 구조는 비교적 간단하며 세 부분으로 구성됩니다.
으로 구별합니다. zval의 구조와 핵심필드의 값을 좀 더 직관적으로 보기 위해 위의 사진을 찍어보겠습니다.
u1.v.type에 대한 설명:
zval에서 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;
zval에서:
zval은 16바이트를 차지합니다. 이에 따라 php5에서는 zval의 크기가 48바이트로, 이는 실제로 엄청난 개선입니다.
은 zend_value의 참여 없이 zval.u1.v.type에 따라 직접 구별 가능
은 lval 또는 zend_value의 dval.
zend_value에 해당하는 포인터를 사용하여 특정 구조를 가리킵니다.
예를 들어 문자열 유형의 구조는
struct _zend_string { zend_refcounted_h gc; zend_ulong h; /* hash value */ size_t len; char val[1]; };
문자열 변수의 메모리 구성은 아래 그림과 같으며, zval.value.str은 zend_string 구조를 가리킵니다.
Zval은 PHP에서 가장 중요한 데이터 구조 중 하나입니다. 여기에는 PHP의 변수 값과 유형에 대한 정보가 포함되어 있습니다.
추천 학습: "PHP7 튜토리얼"
위 내용은 이 기사에서는 php7의 zval을 분석하는 방법을 안내합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!