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

  • 相关阅读:
    js 性能调试
    js 面向对象编程
    js 零碎
    如果遇到二维数组 想取某个字段的和
    昨天写支付接口时遇到支付接口返回数据接收地址,session数据丢失(或者说失效)的问题
    mysql报错: 1548-Cannot load from mysql.proc. The table is probably corrupted 解决办法
    php 时间倒计时代码 个人写法 有好的想法的欢迎贴出来分享
    linux 环境下安装mysql5.6
    关于数据库连接不上 出现错误的问题
    推荐一个不错的css3网站 可以直接调用的
  • 原文地址:https://www.cnblogs.com/tdkj/p/3440128.html
Copyright © 2011-2022 走看看