php变量累加,php 变量(上)

学习自TIPI,做个小结

###PHP变量类型

标量类型:boolean,integer,float,string

复合类型:array,object

特殊类型:resource,NULL

###变量存储结构

zval结构体定义在Zend/zend.h文件中,其结构如下:

1

2

3

4

5

6

7

8

9

10

11/*

* zval

*/

typedef struct _zval_struct zval;

struct _zval_struct {

/* Variable information */

zvalue_value value; /* value */ //存储变量的值

zend_uint refcount__gc; //引用计数,默认值为1

zend_uchar type; /* active type */ //变量具体类型

zend_uchar is_ref__gc; //是否为引用,默认值为0

};

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。

###变量的值存储结构

变量的值存储在zvalue_value联合体中,结构体定义如下:

1

2

3

4

5

6

7

8

9

10typedef union _zvalue_value {

long lval; /* long value */

double dval; /* double value */

struct {

char *val;

int len;

} str;

HashTable *ht; /* hash table value */

zend_object_value obj;

} zvalue_value;

使用联合体而不是用结构体是出于空间利用率的考虑,因为一个变量同时只能属于一种类型。

一般类型

布尔型/整型的变量值存储于(zval).value.lval中,其类型也会以相应的IS_*进行存储。

实数型存储于(zval).value.dval中,其类型为IS_DOUBLE。

NULL值的变量值不需要存储,只需要把(zval).type标为IS_NULL。Z_TYPE_P(z)=IS_NULL;

资源类型的存储与其他一般变量无异,但其初始化及存取实现则不同。Z_TYPE_P(z) = IS_RESOURCE; Z_LVAL_P(z) = l;

字符串的类型标示和其他数据类型一样,不过在存储字符串时多了一个字符串长度的字段。

数组Array,最强大变量类型。数组的值存储在zvalue_value.ht字段中,它是一个HashTable类型的数据。 PHP的数组使用哈希表来存储关联数据。哈希表是一种高效的键值对存储结构。PHP的哈希表实现中使用了两个数据结构HashTable和Bucket。 PHP所有的工作都由哈希表实现。

对象Object,PHP的对象是一种复合型的数据,使用一种zend_object_value的结构体来存放。

1

2

3

4typedef struct _zend_object_value {

zend_object_handle handle; // unsigned int类型,EG(objects_store).object_buckets的索引

zend_object_handlers *handlers;

} zend_object_value;

PHP的对象只有在运行时才会被创建,EG宏,是一个全局结构体用于保存在运行时的数据。 其中就包括了用来保存所有被创建的对象的对象池,EG(objects_store),而object对象值内容的zend_object_handle域就是当前 对象在对象池中所在的索引,handlers字段则是将对象进行操作时的处理函数保存起来,这个结构体及对象相关的类的结构为zend_class_entry。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值