往期精选(欢迎转发~~)
- 如何看待程序员35岁职业危机?
- Java全套学习资料(14W字),耗时半年整理
- 我肝了三个月,为你写出了GO核心手册
- 消息队列:从选型到原理,一文带你全部掌握
- 肝了一个月的ETCD,从Raft原理到实践
- 更多…
大家可能都知道PHP是一种弱语言,也就是在PHP编程中,我们并不关注PHP中变量的类型,这点和C这种强类型语言有非常大的区别,但是PHP是由C来实现的,这是不是有点戏剧化呢,哈哈~~若仔细研究PHP内部的实现细节,其实还挺有意思的,下面初步看一下PHP中对不同类型变量的申明:
<?php
$var = 1; //int
$var = "PHP"; //string
$var = 1.01; //float
$var = array(); //array
$var = new Exception('error'); //object;
?>
对于这些不同的类型,PHP是怎样进行识别的呢?下面让我们看看PHP中变量在内核中的存储结构,该结构主要由结构体zval和联合体zvalue_value组成,至于结构体和联合体的区别,网上教程很多,在此就不多说,下面让我们看看这两个结构是怎么使用的。
struct _zval_struct {
zvalue_value value; // 存储变量的值
zend_uint refcount__gc; // 引用计数
zend_uchar type; // 变量的类型
zend_uchar is_ref__gc; // 是否引用
} zval;
typedef union _zvalue_value {
long lval; // boolean integer
double dval; // float double
struct {
char *val;
int len;
} str; // string
HashTable *ht; // array
zend_object_value obj; // object
} zvalue_value;
先让我们看看结构体zval,里面有4个参数,对于单个变量而言,仅仅zval.value和zval.type就可以完全表示,另外两个变量zval.refcount__gc和zval.is_ref__gc,他们是对变量赋值和变量引用时会用到,这个就涉及到变量的引用与分离,该部分内容后续会单独讲。对于变量的类型zval.type,目前包括null、bool、long、double、string、array、object和resorce,变量的内容为zval.value,我们下面具体分析该内容内部的结构。
zvalue_value.lval会记录bool和integer的数值,zvalue_value.dval会记录float或double类型的数值,然后zvalue_value.str会记录一个字符串,结构如下:
struct {
char *val;
int len;
} str;
字符串zvalue_value.str也是个结构体,里面记录该字符串的长度zvalue_value.str.len和首指针zvalue_value.str.val,zvalue_value.ht和zvalue_value.obj本别表示数组和对象,这两个比较复杂,后续会进行深度解析。
参考:http://www.laruence.com/2008/08/22/412.html