PHP ZVAL은 PHP에서 가장 중요한 데이터 구조 중 하나입니다. PHP에서 변수 값과 유형에 대한 정보가 포함되어 있으며, 기본 구조는 [struct _zval_struct(zvalue_value 값 zend_uchar 유형)]입니다.
PHP ZVAL은 다음을 의미합니다.
ZVAL의 기본 구조
Zval은 PHP에서 가장 중요한 데이터 구조 중 하나입니다. 또 다른 중요한 데이터 구조는 해시 테이블입니다. )에는 PHP의 변수 값 및 유형에 대한 정보가 포함되어 있습니다. hash table
),它包含了PHP中的变量值和类型的相关信息。
它是一个struct,基本结构为:
struct _zval_struct { zvalue_value value; /* 存储变量的值*/ zend_uint refcount__gc; /* 表示引用计数 */ zend_uchar type; /* 变量具体的类型 */ zend_uchar is_ref__gc; /* 表示是否为引用 */ }; typedef struct _zval_struct zval;
其中:
1、zval_value value
变量的实际值,具体来说是一个zvalue_value
的联合体(union):
typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { /* string */ char *val; int len; } str; HashTable *ht; /* hash table value,used for array */ zend_object_value obj; /* object */ } zvalue_value;
2、zend_uint refcount__gc
该值实际上是一个计数器,用来保存有多少变量(或者符号,symbols, 所有的符号都存在符号表(symble table)中, 不同的作用域使用不同的符号表,关于这一点,我们之后会论述)指向该zval。
在变量生成时,其refcount=1,典型的赋值操作如a=b会令zval的refcount加1,而unset操作会相应的减1。在PHP5.3之前,使用引用计数的机制来实现GC,如果一个zval的 refcount较少到0,那么Zend引擎会认为没有任何变量指向该zval,因此会释放该zval所占的内存空间。
但,事情有时并不会那么简单。后面 我们会看到,单纯的引用计数机制无法GC掉循环引用的zval,即使指向该zval的变量已经被unset,从而导致了内存泄露(Memory Leak)。
3、zend_uchar type
该字段用于表明变量的实际类型。在开始学习PHP的时候,我们已经知道,PHP中的变量包括四种标量类(bool,int,float,string),两种复合类型(array, object)和两种特殊的类型(resource 和NULL)。
在zend内部,这些类型对应于下面的宏(代码位置 phpsrc/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 #define IS_CALLABLE 10
4、is_ref__gc
这个字段用于标记变量是否是引用变量。对于普通的变量,该值为0,而对于引用型的变量,该值为1。这个变量会影响zval的共享、分离等。关于这点,我们之后会有论述。
正如名字所示,ref_count__gc
和is_ref__gc
rrreee
그 중:🎜🎜변수의 실제 값, 특히
zvalue_value :🎜rrreee🎜🎜🎜🎜2, <code>zend_uint refcount__gc
🎜🎜🎜🎜🎜이 값은 실제로 얼마나 많은 변수(또는 기호, 기호, 모든 기호가 존재하는지 저장하는 카운터)입니다. 기호 테이블은 다른 범위에서 다른 기호 테이블을 사용합니다. 이에 대해서는 나중에 논의하겠습니다)는 zval을 가리킵니다. 🎜🎜변수가 생성되면 refcount=1입니다. a=b와 같은 일반적인 할당 연산은 zval의 refcount를 1씩 늘리고 unset 연산은 그에 따라 1씩 감소합니다. PHP5.3 이전에는 참조 계산 메커니즘을 사용하여 GC를 구현했습니다. zval의 참조 횟수가 0보다 작으면 Zend 엔진은 zval을 가리키는 변수가 없다고 생각하여 점유된 메모리 공간을 해제했습니다. zval에 의해. 🎜🎜하지만 때로는 상황이 그렇게 간단하지 않을 때도 있습니다. zval을 가리키는 변수가 설정되지 않은 경우에도 간단한 참조 카운팅 메커니즘이 순환 참조 zval을 GC할 수 없어 메모리 누수(Memory Leak)가 발생한다는 사실을 나중에 살펴보겠습니다. 🎜🎜 🎜🎜🎜3. zend_uchar 유형
🎜🎜🎜 🎜🎜이 필드는 변수의 실제 유형을 나타내는 데 사용됩니다. 우리가 PHP를 배우기 시작했을 때, 우리는 PHP의 변수에 4개의 스칼라 클래스(bool, int, float, string), 2개의 복합 유형(배열, 객체) 및 2개의 특수 유형(리소스 및 NULL)이 포함되어 있다는 것을 이미 알고 있었습니다. 🎜🎜zend 내부에서 이러한 유형은 다음 매크로에 해당합니다(코드 위치 phpsrc/Zend/zend.h
): 🎜rrreee🎜 🎜🎜🎜4, is_ref__gc
🎜🎜 🎜 🎜🎜이 필드는 변수가 참조 변수인지 여부를 표시하는 데 사용됩니다. 일반 변수의 경우 값은 0이고 참조 변수의 경우 값은 1입니다. 이 변수는 zval의 공유, 분리 등에 영향을 미칩니다. 이에 대해서는 나중에 논의하겠습니다. 🎜🎜이름에서 알 수 있듯이 ref_count__gc
와 is_ref__gc
는 PHP의 GC 메커니즘에 필요한 두 가지 매우 중요한 필드입니다. 이 두 필드의 값은 xdebug 등을 통해 확인할 수 있습니다. .디버깅 도구 보기 🎜🎜🎜🎜🎜관련 학습 권장사항: 🎜초보부터 마스터까지 PHP 프로그래밍🎜🎜🎜위 내용은 PHP ZVAL은 무엇을 의미하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!