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

  • 相关阅读:
    XAF应用开发教程(七)外观控制模块
    XAF应用开发教程(五)验证模块
    XAF应用开发教程(六)控制器
    XAF应用开发教程(四)应用程序模型
    XAF应用开发教程(三)业务对象模型之引用类型与关联关系
    XAF应用开发教程(二)业务对象模型之简单类型属性
    XAF应用开发教程(一) 创建项目
    CSharp Similarities and Differences
    Nemerle Quick Guide
    2.1 确知信号的类型
  • 原文地址:https://www.cnblogs.com/tdkj/p/3440128.html
Copyright © 2011-2022 走看看