牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2016-08-17 投稿人: 浏览次数:605

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

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。