[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型

来源:互联网 发布:2016年鞍山中考大数据 编辑:程序博客网 时间:2024/05/29 07:56

第一节:变量的结构和类型


类型:

如:字符串,数组,对象等
粗略分为:
强类型:一旦定义类型,不得改变类型,仅仅可以改变值,需要类型转换。
弱类型:一个变量可以表示任意的数据类型。是一个双刃剑。

官方的php变量内部实现:使用数据结构zval来保存,这个结构同时表示php中的各种数据类型,它不仅仅包含变量的值,也包含变量的类型。这就是PHP弱类型的核心。

zval结构具体是如何实现弱类型的呢?一探究竟!

PHP的变量类型及存储结构


PHP在声明或使用变量的时候,并不需要显示指明其数据类型。
PHP的8种类型:
标量类型:boolen,integer,float(double),string
复合类型:array,object
特殊类型:resource,NULL

官方PHP是C实现的,而C是强类型的语言,具体是怎么实现的呢?????

变量存储结构

变量的值存储到以下所示zval结构体中。zval结构体定义在Zend/zend.h文件,其结构如下:

typedef struct _zval_struct zval;...struct _zval_struct{     // 变量信息     zvalue_value value;// 值------------------->变量具体的值     zend_uint refcount__gc;------------------->变量引用计数     zend_uchar type;// 数据类型--------------->变量的具体类型     zend_uchar is_ref__gc;---------------------->表示是否为引用}

在php5.3之后,引入了新的垃圾收集机制,修改如上例子。

此处注意:变量值的类型是 zvalue_value 的数据类型。接下来我们就说一下这个 zvalue_value类型

变量的类型:

对于定义上面的 zend_uchar type可以的取值为:
IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE,IS_STRING,IS_ARRAY,IS_OBJECT,IS_RESOURCE,IS_CONSTANT,IS_CONSTANT_ARRAY

zvalue_value的结构体定义如下:

typedef union _zvalue_value{     long lval;     double dval;     struct {          char *val;          int len;     }     HashTable *ht;     zend_object_value obj}zvalue_value;

说明:为什么使用联合体,而不是结构体:因为php的一个变量同时只能属于一种类型。如果使用结构体空间浪费比较大,这种成本小,收益大。

php变量类型对应的具体的方式

一般类型

变量类型 宏
boolean: ZVAL_BOOL 布尔型/整型的变量值存储于(zval).value.lval中,其类型也会相应的IS_*进行存储
integer ZVAL_LONG
float ZVAL_DOUBLE
null ZVAL_NULL NULL值的变量不需要存储,只需要把zval.type标识为IS_NULL
resource ZVAL_RESOURCE 资源类型的存储与其它一般变量没什么区别,初始化及存取实现不同。

字符串string

字符串存储,会多一个字符串的长度,

struct{     char *val;     int len;}str;

说明:C里面的字符是\0 结尾的,PHP这样做就是为了空间换时间。

数组

数据是存放在zval.ht字段中的。它是 HashTable实现的。

对象

对象的内部实现是一种复合数据类型。

typedef struct _zend_object_value{     zend_object_handle handle;     zend_object_handler *handlers;}zend_object_value;

总结来说:为什么php能够实现弱类型,就是,其实每一个php变量的具体实现都是一个全部类型的集合的联合体。哈哈!

0 0