您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 昭通分类信息网,免费分类信息发布

深入了解PHP内核(五)变量及数据类型-变量的结构和类型

2024/2/29 17:50:07发布21次查看
深入理解php内核(五)变量及数据类型-变量的结构和类型
原文链接:http://www.orlion.ga/238/
编程语言的类型可以分为强类型和弱类型两种,php是弱类型语言,但是c语言是强类型语言。在官网php实现内部,所有变量使用同一种数据结构(zval)来保存,这个结构表示php中的各种数据类型,它不仅包含变量的值,也包含变量的类型。这就是php弱类型的核心。
那zval结构是如何实现弱类型的呢?
一、php变量类型及存储结构
php在声明和使用变量的时候,并不需要指明其数据类型,php是弱类型语言,但是php有类型,php有八中数据类型,可以分成三类:标量类型:boolean、integer、float(double) string;复合类型:array、object;特殊类型:resource、null
    c语言是如何实现php中的弱类型的呢?
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;};
zval结构体中有四个字段,其含义分别为:
属性名 含义 默认值
refcount_gc 表示引用计数 1
is_ref_gc 表示是否为引用 0
value 存储变量的值
type 变量具体的类型
在php5.3之后,引入了新的垃圾回收机制,引用计数和引用的字段名改为refcout_gc和is_ref_gc在此之前为refcount和is_ref.
变量的值存储在另外一个结构体zvalue_value,值存储见下面的介绍。
2、变量类型
zval结构体的type字段就是实现弱类型最关键的字段了,type的值可以为:is_null、is_bool、is_long、is_double、is_string、is_object和is_resource之一。除此之外和它们定义在一起的类型还有is_constant、is_constant_array。
二、变量的值存储
前面提到变量的值存储在zvalue_value联合体中,结构体定义如下:
typedef 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;
各种类型的数据会使用不同的方法来进行变量值的存储,其对应赋值方式如下:
一般类型:
变量类型 宏
boolean zval_bool 布尔型/整型的变量值存储于(zval).value.lval中,其类型也会
以相应的is_*进行存储
integer zval_long
float zval_double z_type_p(z)=is_bool/long;z_lval_p(z)=(b)!=0;
null zval_null null值的变量值不需要存储,只需要把(zval).type标为is_nul
z_type_p(z)=is_null;
resource zval_resource 资源类型的存储与其他一般变量无异,但其初始化及存储实现则不
同z_type_p(z) = is_resource; z_lval_p(z) = 1;
字符串
字符串的类型标示和其他数据类型一样,不过在存储字符串时多了一个字符串长度的字段。
struct { char *val; int len;} str;
(存储字符串长度是因为字符串的操作十分频繁,有利于节省时间,是空间换时间的做法)
数组array
数组是php中最常用也是最强大变量类型。数组的值存储在zvalue_value.ht字段中,它是一个hashtable类型的数据。php数组使用哈希表来存储关联数据。php的哈希表实现中使用了两个数据结构hashtable和bucket。php所有的工作都是由哈希表实现。
对象object
php的对象是一种复合型的数据,使用一种zend_object_value的结构体来存放,其定义如下
typedef 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字段则是将对象进行操作时的处理函数保存起来。
php的弱变量容器的实现方式是兼容并包的形式体现。
昭通分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录