摘要:大家都知道是一个弱类型的语言,变量的类型是随着赋值的类型变化的,的底层是用写的,本身是一个强类型的语言,那在底层是怎么实现类型的呢其实在底层,是通过一个结构体来存储所有的变量的。
大家都知道php是一个弱类型的语言,变量的类型是随着赋值的类型变化的,php的底层是用C写的,C本身是一个强类型的语言,那php在底层是怎么实现类型的呢?
其实在底层,php是通过一个结构体来存储所有的变量的。结构体如下:
typedef struct _zval_struct zval typedef struct _zval_struct { /* Variable information */ zvalue_value value; zend_uint refcount_gc; zend_uchar type; zend_uint is_ref_gc; }
解释一下几个变量的意义:
zend_value value 储存的值,此处是一个指针,指到一个union的指针。php本身的值就是存储在这个联合体中。
zend_uint is_refcount 存储的是引用计数
zend_uchar type 存储变量的类型。
zend_uint is_ref_gc 是否是引用传值。
php中所有的结构都是从用这个结构实现的。其中最关键的字段就是里面的type字段了。
type字段总共有7个值,分别是IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE,IS_STRING,ISARRAY,IS_OBJECT,IS_RESOURCE。
这个里面包含了所有的php基本类型:
标量类型:IS_BOOL,IS_lONG,IS_DOUBLE,IS_STRING 复合类型:IS_ARRAY,IS_OBJECT 特殊类型:IS_RESOURCE,IS_NULL
zval结构根据不同的类型,其zval结构中的zval字段指向的联合体中存储不同的值.这个联合体就是php中同一个变量可以存储不同的值的关键.结构如下:
typedef union _zval_value{ long *lval; double *dval; struct { char *val; int len; }str; HashTable *ht; zend_object_value obj; }
从这个结构里可以看出php中所有变量的痕迹:
IS_BOOL(boolen),是存储在lval里面,和整数存储师一样的。这里大家应该想到==和===对于false和0处理的不同之处了。
IS_LONG(整型),存储在lval
IS_DOUBLE(浮点型),存储在dval
IS_STRING(字符串),存储在str
IS_ARRAY(数组),存储在*ht哈希table中
IS_OBJECT(对象),存储在zend_object_value
IS_NULL,NULL值在这个结构中不用存储,直接在zval结构中的type字段进行判断。
简单的介绍一下字符串的存储:
字符串的在联合体中使用结构体的形式出现,代码如下:
struct { char *val; int len; }str;
可以看到,php在存储字符串时,将字符串的内容和长度都存了起来,这是为了避免重复计算字符串的长度。php中的函数strlen,就是直接返回了这个长度。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/20817.html
摘要:对于来说,变量有全局变量和局部变量之分那么,他们都是存储到一个哈希表内了么其实不是的,变量存储也有作用域的概念。 上次跟大家讲了垃圾回收机制后,有些小伙伴对底层原理比较感兴趣,私信问我了一些关于变量的相关知识,既然大家对变量比较感兴趣,那么这次我们来系统的讲一下变量的底层原理 变量结构 首先,我们还是先摆上我们的zval结构体,即php所有变量都会以zval结构体的形式实现 struc...
摘要:所以想要理解更深入的同学最好查看下我之前的关于介绍变量函数的文章类的数据结构不管是普通类还是抽象类或是接口,都存放到统一的结构体中,并且在生成中间代码时,会将此类添加到全局类列表中。 对于PHPer来说,OOP是不可或缺的开发思维,但是你对php类和对象的底层实现又了解多少呢?本着知其然且知其所以然的思想,让我们一起来寻找答案~ 类的底层实现可看作是之前我们讲过的变量、函数等的知识集合...
摘要:数组是最常用的数据类型,同时容易上手也得益于其强大的数组,但是数组在中是如何实现的呢首先,我们还是先了解下相关的数据结构,为下面的内容打好基础哈希表哈希表,顾名思义,即将不同的关键字映射到不同单元的一种数据结构。 数组是PHPer最常用的数据类型,同时php容易上手也得益于其强大的数组,但是数组在php中是如何实现的呢? 首先,我们还是先了解下相关的数据结构,为下面的内容打好基础 哈希...
摘要:但是对于结构体中的和字段我们一直都没有详细介绍过,而这两个字段其实是和变量之间赋值的原理有着密切的关系的。 上周我们从底层的角度介绍了php变量从生成->常量赋值->销毁的完整生命周期(不了解的同学可以翻看一下前面的文章php底层原理之变量(一)),但是我们留了一个思考,不知道大家有答案了没,变量之间的赋值在底层又是如何实现的呢? 变量之间赋值 php变量的zval结构,我们已经介绍了...
阅读 3023·2021-10-27 14:16
阅读 2857·2021-09-24 10:33
阅读 2239·2021-09-23 11:21
阅读 3211·2021-09-22 15:14
阅读 787·2019-08-30 15:55
阅读 1647·2019-08-30 15:53
阅读 1715·2019-08-29 11:14
阅读 2177·2019-08-28 18:11