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_