php底层原理之PHP变量的存储

首先,php的解析引擎是Zend引擎,。在zend引擎中是使用zval结构来存储php变量的,zend是用c写的,所以代码中的结构定义也是c的语言结构,建议看懂不的话自行百度或者看书补一下。结构图如下:
从上图可以看出,zval中包含有四个属性,分别是value,type,refcount,is_ref。
value: 知道一个union指针, 用于存储变量的值,支持的类型有
1)long:整型,不区别长短,统一为long,取值范围是由编译器位数来决定),double,str
2)double:浮点数,也是不区分float或者double,只有一种
3)结构体str:php在存储字符串时,将字符串的内容和长度都存了起来,这是为了避免重复计算字符串的长度。php中的函数strlen,就是直接返回了这个长度。
4)hashTable:用于存放数组,课件php的数组效率是极快的,O(1), 后面再介绍一下zend中hashtable的实现吧
5)obj:用于存放对象,我们看一下zend_object_value的定义,实际是一个handle(对象的唯一id)跟handles(存了对象里各种方法的指针的虚函数表)

type:type值是用来判断value中的值,对应的,如下表:
然后,你会发现php的资源居然是存的long类型,那是因为,这个long存的是一个指针,内部数组的index或者是其他结构的资源,可以将其视为handle。

refcount:引用计数,为了减少 内存池的开销和垃圾回收,加入了该字段,这样在下一次用到同一个值的时候就会直接引用该值,然后refcount++就好,当你unset掉某个变量是也是会相应refcount--,直到为0时则会回收把它干掉

is_ref:是否为饮用,1为引用,0为否。php中可以分为两种变量,引用和非引用,非引用就是正常的赋值,但是引用的话是传递地址,需要在前面加上“&”,相当于指针,改变引用的值是会改变原来改地址的变量的值的。





猜你喜欢

转载自blog.csdn.net/shalaoq/article/details/52585807
今日推荐