PHP7内核基础知识之变量类型

前言

下面我们大概了解下PHP7的变量类型都有哪些,是如何存储变量的。

zval结构定义

PHP7中是使用zval结构存储变量信息的。zval结构的定义在./Zend/zend_types.h文件中定义。

struct _zval_struct {
    zend_value        value;            /* value */
    union {
        struct {
            ZEND_ENDIAN_LOHI_4(
                zend_uchar    type,         /* active type */
                zend_uchar    type_flags,
                zend_uchar    const_flags,
                zend_uchar    reserved)     /* call info for EX(This) */
        } v;
        uint32_t type_info;
    } u1;
    union {
        uint32_t     var_flags;
        uint32_t     next;                 /* hash collision chain */
        uint32_t     cache_slot;           /* literal cache slot */
        uint32_t     lineno;               /* line number (for ast nodes) */
        uint32_t     num_args;             /* arguments number for EX(This) */
        uint32_t     fe_pos;               /* foreach position */
        uint32_t     fe_iter_idx;          /* foreach iterator index */
    } u2;
};

变量的值

通过上面的代码我们可以看到。变量是通过一个_zval_struct结构体方式存储的。其中结构体中的value存储的是变量的值。这个成员是zend_value类型的。zend_value类型的定义如下:

typedef union _zend_value {
    zend_long         lval;             /* long value */
    double            dval;             /* double value */
    zend_refcounted  *counted;
    zend_string      *str;
    zend_array       *arr;
    zend_object      *obj;
    zend_resource    *res;
    zend_reference   *ref;
    zend_ast_ref     *ast;
    zval             *zv;
    void             *ptr;
    zend_class_entry *ce;
    zend_function    *func;
    struct {
        uint32_t w1;
        uint32_t w2;
    } ww;
} zend_value;

zend_value是一个联合体。对于小于64位的简单类型,会直接存储值。如,long double。而对于其他比较复杂的类型,如字符串,数组,对象等,是存储的指针。这样,对于简单类型来说,变得简单高效。

获取变量类型

zval联合体的type存储的是变量的类型。PHP7已经提供了我们获取变量类型的宏方法Z_TYPE。宏方法的定义如下:

static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
    return pz->u1.v.type;
}
#define Z_TYPE(zval)                zval_get_type(&(zval))
#define Z_TYPE_P(zval_p)            Z_TYPE(*(zval_p))

设置变量类型

在PHP7中,设置变量类型提供了新的方法。

#define Z_TYPE_INFO(zval)       (zval).u1.type_info
#define Z_TYPE_INFO_P(zval_p)       Z_TYPE_INFO(*(zval_p))

代码实例

下面的代码实现了一个类似var_dump的方法。

PHP_FUNCTION(dump)
{
    zval *arg;
    if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &arg) == FAILURE) {
        return;
    }
    switch (Z_TYPE_P(arg)) {
        case IS_NULL:
            RETVAL_STRING("NULL");
            break;

        case IS_TRUE:
            RETVAL_STRING("true");
            break;

    case IS_FALSE:
            RETVAL_STRING("false");
            break;

        case IS_LONG:
            RETVAL_STRING("integer");
            break;

        case IS_DOUBLE:
            RETVAL_STRING("double");
            break;

        case IS_STRING:
            RETVAL_STRING("string");
            break;

        case IS_ARRAY:
            RETVAL_STRING("array");
            break;

        case IS_OBJECT:
            RETVAL_STRING("object");
            break;

        case IS_RESOURCE:
            RETVAL_STRING("resource");
            break;

        default:
            RETVAL_STRING("unknown type");
    }
}
时间: 2024-11-03 01:22:10

PHP7内核基础知识之变量类型的相关文章

C# 基础知识 (五).变量类型和字符串处理

        这篇文章是阅读<C#入门经典(Beginning C#)>书籍里面的内容,作者Karli Watson.主要包括自己缺乏的一些C#基础知识和在线笔记使用,文章主要包括C#简单变量类型和复杂变量类型.命名规则.隐式转换和显示转换.变量字符串处理等内容,都是非常基础的知识,希望对初学者有所帮助. 一. C#简单变量类型和命名规则         简单类型组成应用程序中基本构件的类型,其中主要有以下类型: 整数类型                       sbyte(-128~1

BGP基础知识:报文类型和状态机

BGP博大精深,在学习的时候我们会发现和传统的IGP有很大的区别,以至于我们在学习的时候很多东西都是在颠覆我们传统的概念,而让学习变得更加困难. 学习是一个渐进的过程.所以对于学习BGP这个路由协议来说一定要做好充分的思想准备. 在正式开始学习BGP技术本身以前,最好先在网上查一下BGP这个路由协议产生的背景,为什么人们会需要bgp这个大型的路由技术,他能帮人类解决通讯的什么问题? 为什么传统的IGP不能胜任这些工作. 在用实验验证原理之前,首先会把所有bgp比较重要的原理都整理出来.俗话说磨刀

Java核心技术 卷Ⅰ 基础知识(原书第10版)

Java核心技术系列 Java核心技术 卷Ⅰ 基础知识 (原书第10版) Core Java Volume I-Fundamentals (10th Edition) [美] 凯S.霍斯特曼(Cay S. Horstmann) 著 周立新 陈 波 叶乃文 邝劲筠 杜永萍 译 图书在版编目(CIP)数据 Java核心技术 卷Ⅰ 基础知识(原书第10版) / (美)凯S. 霍斯特曼(Cay S. Horstmann)著:周立新等译. -北京:机械工业出版社,2016.8 (Java核心技术系列) 书

PHP内核介绍及扩展开发指南—基础知识

  一. 基础知识 本章简要介绍一些Zend引擎的内部机制,这些知识和Extensions密切相关,同时也可以帮助我们写出更加高效的PHP代码. 1.1 PHP变量的存储 1.1.1 zval结构 Zend使用zval结构来存储PHP变量的值,该结构如下所示: typedef union _zvalue_value {      long lval;              /* long value */      double dval;                /* double 

PHP内核介绍及扩展开发指南—基础知识_php技巧

一. 基础知识 本章简要介绍一些Zend引擎的内部机制,这些知识和Extensions密切相关,同时也可以帮助我们写出更加高效的PHP代码. 1.1 PHP变量的存储 1.1.1 zval结构 Zend使用zval结构来存储PHP变量的值,该结构如下所示: 复制代码 代码如下: typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val;

关于JavaScript的变量的数据类型的判断方法_基础知识

  虽然Javascript是弱类型语言,但是,它也有自己的几种数据类型,分别是:Number.String.Boolean.Object.Udefined.Null.其中,Object属于复杂数据类型,Object   由无序的键值对组成.其余几种都属于简单数据类型.注意:变量类型首字母大写,而变量值首字母是小写的.   JavaScript不支持自定义类型,所以JavaScript中的所有值都属于这六种类型之一.   要搞清楚一个变量是何种数据类型,就要使用typeof操作符了,注意,尤其要

简单介绍JavaScript的变量和数据类型_基础知识

 JavaScript数据类型: 编程语言的最根本的特征之一是一组它支持的数据类型.这些是可被表示和操纵的编程语言的值的类型. JavaScript允许有三个基本数据类型:     数字如. 123, 120.50 等.     字符串如 "This text string" 等.     布尔类型,如 true 或 false. 的JavaScript还定义了两种数据类型:null和undefined,其每一个仅限定一个单一的值. 除了这些基本的数据类型,JavaScript支持被称

JavaScript语言核心数据类型和变量使用介绍_基础知识

任何的编程语言都有自己的语言核心,和众多编程语言一样,JavaScript也有自己语言的核心.语言的核心部分一般被称之为JavaScript最为基础的部分.正所谓万事开头难,学习JavaScript也是一个道理,也有句古话说得好,好的开始是成功的一半.了解并学好JavaScript的语言核心部分是JavaScript学习道路上非常良好的开始. 下面是一段代码,主要介绍了JavaScript的数据类型和变量: 复制代码 代码如下: //在script标签中,所有//后面的内容都称之为注释 //注释

浅析JavaScript中的对象类型Object_基础知识

ECMAScript中的对象其实就是一组数据和功能的集合. ECMAScript中Object是所有对象的基础. 理解:Object类型是所有它的实例的基础,换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中. Object的实例都具有以下属性和方法 1.Constructor:保存着用于创建当前对象的函数 2.hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是原型中)是否存在.其中作为参数的属性名必须以字符串指定 3.i