多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## php的弱类型是怎么实现的?  php是通过c语言进行实现,但是c语言为强类型,那php的弱语言类型是通过PHP底层设计了一个zval(“Zend value”的缩写)的数据结构,可以用来表示任意类型的PHP值。通过**共同体**实现弱类型变量声明。  ## 简单说下对php 底层变量(zval)数据结构的理解  1. 变量存储结构  变量的值存储到以下所示zval结构体中。 zval结构体定义在Zend/zend.h文件,其结构如下:  ~~~ typedef struct _zval_struct zval; ... struct _zval_struct { /* Variable information */ zvalue\_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; };  ~~~  PHP使用这个结构来存储变量的所有数据。和其他编译性静态语言不同, PHP在存储变量时将PHP用户空间的变量类型也保存在同一个结构体中。这样我们就能通过这些信息获取到变量的类型。  zval结构体中有四个字段,其含义分别为:  | 属性名 | 含义 | 默认值 | | \--- | \--- | \--- | | refcount__gc | 表示引用计数 | 1 | | is_ref__gc | 表示是否为引用 | 0 | | value | 存储变量的值 | | | type | 变量具体的类型 | |  2.变量类型:  zval结构体的type字段就是实现弱类型最关键的字段了,type的值可以为: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE 之一。 从字面上就很好理解,他们只是类型的唯一标示,根据类型的不同将不同的值存储到value字段。 除此之外,和他们定义在一起的类型还有IS_CONSTANT和IS_CONSTANT_ARRAY。  这和我们设计数据库时的做法类似,为了避免重复设计类似的表,使用一个标示字段来记录不同类型的数据。