文件: Zend/zend.h 316行左右(PHP的底层文件)
PHP变量的值是放在zval结构体中的value段中的
文件: Zend/zend.h
结构体的字段解释:
struct _zval_struct {
/* Variable information */
zvalue_value value; /*变量的值,是个联合体*/
zend_uint refcount__gc; /*指向次数*/
zend_uchar type; /* 变量类型 */
zend_uchar is_ref__gc; /*是否引用*/
};
type字段的值为以下常量(其中type常量的枚举,是PHP中的8种类型)
IS_NULL, IS_BOOL,IS_LONG,IS_DOUBLE
IS_STRING,IS_ARRAY,IS_OBJECT
IS_RESOURCE
疑问 :
PHP中有8种数据类型,为什么zval->value 联合体中,只有5种?
答:
1: NULL,直接 zval->type = IS_NULL,就可以表示,不必设置 value的值.
2: BOOL型 , zval->type = IS_BOOL, 再设置 zval.value.lval = 1/0;(C语言中是没有BOOL类型的,是用0/1来表示)
3: Resourc型 ,资源型 往往是服务器上打开的一个接口,如果 文件读取接口.
zval->type = IS_RESOURCE, zval->tyoe.lval = 服务器上打开的接口的编号
字符串长度在底层的实现原理:
$b = 'hello';
//在C的实现原理如下:
/**
{
{
char : 'hello'
len : 5
}
type : IS_STRING
refcount_gc : 1
is_ref_gc : 0
}
可以看出,在PHP中,字符串的长度是直接体现在其结构体中的,strlen的调用速度非常快,时间复杂度为0(1)
变量的创建步骤:
$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);
}