zoukankan      html  css  js  c++  java
  • 深入理解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的弱变量容器的实现方式是兼容并包的形式体现。

  • 相关阅读:
    《Java大学教程》—第12章 案例研究--第2部分
    《Java大学教程》—第11章 案例研究--第1部分
    《Java大学教程》—第10章 图形和事件驱动程序
    《Java大学教程》—第8章 通过继承扩展类
    《Java大学教程》—第7章 类的实现
    《Java大学教程》—第6章 类和对象
    《Java大学教程》—第5章 数组
    《Java大学教程》—第4章 方法的实现
    spring_01概念及案例
    MyEclipse中jsp编码设置
  • 原文地址:https://www.cnblogs.com/orlion/p/5318325.html
Copyright © 2011-2022 走看看