zoukankan      html  css  js  c++  java
  • PHP变量的实现原理【转】

    PHP是一门弱语言,也就说PHP的一个变量可以保存任意类型的变量,PHP是用C语言实现的,而C语言是一个强类型的语言,每个变量都有固定的类型,不能随意改变变量的类型(虽然可以通过强制类型转换,可能会出问题)。在zend引擎中的实现:

    引用的是PHP 5的源码:

     

    打开zend.h 会发现定义了如下的结构体:

     

    typedef struct _zval_struct     zval;

     

    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;

    zend_ast *ast;

    } zvalue_value;

     

    struct _zval_struct {

    /* Variable information */

    zvalue_value value; /* value */

    zend_uint refcount__gc;

    zend_uchar type; /* active type */

    zend_uchar is_ref__gc;

     

    };

    其中 zval 就是PHP的变量的底层实现,zval是用结构体来实现的。

    zvalue_value中:

    lval 是long类型数据,即是C语言中long。

    dval 是double类型数据,即是C语言中double。

    str  是一个结构体,成员变量var是char类型的指针,指向一个字符数组的首地址,为了数据安全,用len告诉系统要取多长的数据。

    ht   是一个hash表结构,是为了存储数组;

    obj  是为了存储对象类型;其中zend_object_value 就是zend为了存储对象而定义的结构体。

    ast  是PHP 5.6以后才有的,是为了存储常量;

     

    在_zval_struct中,

    value  即是上述所说的zvalue_value,也就是存储的数据;

    refcount__gc 即是变量的引用数,变量引用计算器。

    type 变量的类型,为了保存当前所存储的数据,是哪一个类型的数据;常用类型如下所示:

    #define IS_NULL 0

    #define IS_LONG 1

    #define IS_DOUBLE 2

    #define IS_BOOL 3

    #define IS_ARRAY 4

    #define IS_OBJECT 5

    #define IS_STRING 6

     

    #define IS_RESOURCE 7

     

    is_ref__gc 变量是否被引用。

     

    对变量类型的解析:

    IS_NULL

    0

    IS_LONG

    1

    long类型变量

    IS_DOUBLE

    2

    double类型变量

    IS_BOOL

    3

    布尔变量

    IS_ARRAY

    4

    数组

    IS_OBJECT

    5

    对象

    IS_STRING

    6

    字符串

    IS_RESOURCE

    7

    资源类型变量

     

    关于资源类型的变量:资源类型是一种特殊的变量,保存了到外部资源的一个引用。比如数据库的连接,打开文件,图形画布区域;

    资源类型本质上存储是一个整数,也就是resource ID ,zend可以根据这个ID去找到最终所需要的数据;

    例如:$file_source = fopen(“a.txt”,”r”);

    可以用is_resource()函数测定一个变量是否是资源,函数get_resource_type()则返回该资源的类型。

    关于变量的赋值会有 写时复制机制。

  • 相关阅读:
    sudo 之后 unable to resolve host的问题解决办法
    Linux 查找具体的文件名称
    linux 访问远程务器代码
    spark 安装配置
    R基本介绍
    BIEE多层表头报表的制作方法
    支付宝新漏洞引发恐慌,那如何关闭小额免密支付呢
    大家注意了,支付宝被曝重大安全漏洞,回应称正在跟进排查
    2017年5个不应该被忽视的机器学习项目
    婚前最后一次加班
  • 原文地址:https://www.cnblogs.com/muziyun1992/p/6854230.html
Copyright © 2011-2022 走看看