深入理解PHP原理之变量结构

往期精选(欢迎转发~~)

大家可能都知道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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值