PHP底层原理知其然知其所以然

北京中科白殿疯怎么样 https://mip.yyk.99.com.cn/fengtai/68389/

1·、PHP变量的底层实现

PHP代码执行图解

1.1:变量在内存中的存储结构

PHP变量是通过zval结构体来存储的,文件:Zend/zend.h行左右

1.2:值的存储

PHP变量的值是放在zval结构体中的value段中的,文件:Zend/zend.h

1.3:结构体的字段解释

struct_zval_struct{

/*Variableinformation*/

zvalue_valuevalue;/*变量的值,是个联合体*/

zend_uintrefcount__gc;/*指向次数*/

zend_uchartype;/*变量类型*/

zend_ucharis_ref__gc;/*是否引用*/

};

type字段的值为以下常量

IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE

IS_STRING,IS_ARRAY,IS_OBJECT

IS_RESOURCE

1.4:联合体中的值

typedefunion_zvalue_value{

longlval;/*longvalue*/

doubledval;/*doublevalue*/

struct{

char*val;

intlen;

}str;

HashTable*ht;/*hashtablevalue*/

zend_object_valueobj;

}zvalue_value;

联合中为什么只列出了5种值?

NULL不用,zval的type为IS_NULL即可

Bool以1,0存储在lval上

resource的type为resource,其resource的内容用long来标志(资源标记)

1.5:变量的结构图

1.6:变量的创建

创建变量的步骤:str=hello;

1:创建zval结构,并设置其类型IS_STRING

2:设置其值为hello

3:讲其加入符号表

{

zval*fooval;

MAKE_STD_ZVAL(fooval);

ZVAL_STRING(fooval,hello,1);

ZEND_SET_SYMBOL(EG(active_symbol_table),foo,fooval);

}

1.7:符号表symbol_table

符号表是什么?

符号表是一张哈希表,里面存储了变量名-变量的zval结构体的地址,

//zend/zend_globals.h行

struct_zend_executor_globals{

...

...

HashTable*active_symbol_table;/*活动符号表*/

HashTablesymbol_table;/*全局符号表*/

HashTableincluded_files;/*filesalreadyincluded*/

1.8:符号表与函数

Zend/zend_


转载请注明:http://www.aierlanlan.com/rzfs/1611.html