php底层--3

2016-10-01

一.变量类型的实现

php源码结构体中的type类型主要是有IS_NULL,IS_RESOURCE,IS_ARRAY,IS_OBJECT,IS_LONG,IS_BOOL,IS_DOUBLE,IS_STRING,

对应的PHP中的8中数据类型,但是奇怪的是,zvalue_value 的union中只有5种与之匹配的类型,少的3三种是NULL,BOOL,RESOURCE,

union中为什么会少三种呢?

1.null类型是空, 是没有value的值的,自然就不必设置了。

2.bool型,在C语言中,bool型是用0,1判断的,不会再生出一个专门表示0,1的类型

3.resource,往往是服务器上的一个资源句柄。

PS:关于Php中字符串的长度

  在PHP中,字符串的长度是直接体现在其结构体中的,所以调用strlen函数速度非常快。

  char:hello

  len:5

  type:IS_STRING

  refcount_gc:1

  is_ref_gc:0

二.符号表

  我们刚刚所说的都是php底层去存储php的值,例如:$a=3,都是说php底层是怎么去存储这个3的,在zvalue结构体中,type是IS_LONG,zvalue union是3,

但是我们该怎么去存储这个键名$a呢,这个就是我们说的符号表

  什么是符号表?--->符号表就是一张哈希表,里面存储了变量名($a)-->变量的zval结构体的地址

  struct _zend_executor_globals{

  HashTable *active_symbol_table; //活动符号表

  HashTable symbol_table //全局符号表

例如:

  $a=3;

  $b='hello'

php底层生成了3这个结构体和hello这个结构体,同事,符号表里也多了2条记录,

a-->0x123(结构体3的内存地址)

b-->0x111(结构体hello的内存地址)

 

  }

 

posted @ 2016-10-22 21:00  tianye_guazi  阅读(143)  评论(0编辑  收藏  举报