이 기사에서는 PHP 변수 구조에 대한 관련 지식을 주로 소개합니다. 이 기사에서는 PHP5의 zval과 PHP 7의 zval을 언급합니다. 코드가 간단하고 이해하기 쉽습니다.
// 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;
대부분의 기사에서는 PHP5 변수 구조를 언급할 때 sizeof(zval) == 24, sizeof(zvalue_value) == 16을 언급합니다. 실제로 이 논의는 CPU가 64비트인 경우 정확하지 않습니다. 결과는 맞습니다. 그러나 CPU가 32비트인 경우: sizeof(zval) == 16, sizeof(zvalue_value) == 8, 주로 CPU가 64비트인 경우 포인터가 8바이트를 차지하고 CPU가 32비트인 경우 포인터가 4바이트를 차지하기 때문입니다. 바이트.
// 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;
PHP 7에는 많은 것이 있는 것처럼 보이지만 실제로는 더 간단합니다. CPU가 32비트인지 64비트인지에 관계없이 sizeof(zval)는 항상 16입니다. 주로 zend_value의 ww를 살펴보세요. 이는 uint32_t 2개입니다. 이는 항상 8바이트이므로 sizeof(zend_value) == 8이므로 sizeof(zval) == 16입니다.
요약
위 내용은 PHP 변수 구조에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!