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,后边会实验解释……

  • 相关阅读:
    运算符的优先级(从高到低)
    常用字符与ASCII代码对照表
    02.数据类型常量与变量
    Java基础01
    2以太坊入门的方法2
    区块链学习笔记1
    5关键字this与super的区别
    4Java中成员变量与局部变量
    lua返回页面时中文乱码
    struts2中<jsp:forward>跳转时报404错误的问题
  • 原文地址:https://www.cnblogs.com/tdkj/p/3440128.html
Copyright © 2011-2022 走看看