变量的底层实现

PHP变量是通过zval结构体来存储的

文件: Zend/zend.h 316行左右(PHP的底层文件)



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


变量的底层实现_第1张图片


结构体的字段解释:

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);
}









你可能感兴趣的:(变量的底层实现)