zoukankan      html  css  js  c++  java
  • php变量那些事:php引擎对变量声明、存储简要分析(ZVAL)

    php中变量有三个基本的特性:

    1、变量符号。也就是变量的名称。形象比喻,kv中的key。这个有php引擎的符号表(hash表)管理。

    2、变量类型。一个php变量可以是boolean、integer、float、string、array、object、resource或者为NULL。

    3、变量内容。比如:1、"sdfsdf"、array(1,2,3)。由内存分配。

    php引擎中的变量描述:

    typedef union _zvalue_value{

        long lval;

        double dval;

        struct {

            char *val;

            int len;

        } str;

        HashTable *ht;

        zend_object_value obj;

    } zvalue_value;

    typedef struct _zval_struct zval;

    struct _zval_struct {

        zvalue_value value;

        zend_uint refcount;

        zend_uchar type;  

        zend_uchar is_ref;

    };

    解释说明:

    1、从上面的结构可以看出zend用zval结构描述了上述的2、3特性。union类型的_zvalue_value实现了php的弱类型,也就是不用声明php变量的类型,它可以是任意一个合法的php类型。

    2、_zvalue_value中,lval用于存储boolean、integer、resource,dval用于存储float,str用于存储string,ht用于存储array,obj用于存储object,NULL类型不存储,zval.type=IS_NULL。此处可以看出php的资源类型resource实质是是一个整形,它是一个指向资源的c指针。

    3、_zval_struct 结构中。is_ref表示该zval是不是一个引用(php中的引用,不用于c中的指针)。refcount为指向这个zval的符号表中的变量名的个数(用于垃圾回收),也就是说有几个变量用到这个zval。type为php变量的类型。

    举例:

    <?php

    $a=123;

    $b=$a;

    ?>

    $a=123;

    声明一个变量名$a,由符号表管理。同时创建一个zval。zval.is_ref=0,zval.refcount=1,zval.lval=123,zval.type=ZVAL_LONG。

    $b=$a;

    此处声明一个变量$b,由符号表管理。这个语句在执行的时候并没用创建zval,而是和符号$a指向了同一个zval。zval.refcount=2。如果后边再来一个$b=56;此时会创建另外一个zval,后边会实验解释……

  • 相关阅读:
    LeetCode Ugly Number
    LeetCode Missing Number
    拓扑排序
    不相交集的求并算法(按集合大小求并+按高度求并)
    数据结构排序总结
    基数排序
    java 发展简史
    java 白皮书的关键术语
    包+类导入+静态导入+类放入包中+包作用域
    关于二叉堆(优先队列)的其他操作及其应用
  • 原文地址:https://www.cnblogs.com/tdkj/p/3440128.html
Copyright © 2011-2022 走看看