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");
    }
}


目录
相关文章
|
1月前
|
缓存 自然语言处理 PHP
深入PHP内核:理解OPcode和执行生命周期
在PHP的执行过程中,源代码经过词法分析、语法分析等一系列复杂的步骤后,最终会编译成一种叫做“操作码”(OPcode)的中间代码。本文将深入探讨PHP的操作码(OPcode)是什么,它是如何生成的,以及它在整个PHP脚本执行周期中扮演的角色。我们还将了解不同的OPcode优化技术,以及它们如何影响PHP应用程序的性能。通过本文,读者将对PHP的内部工作原理有更深刻的理解,为进一步的性能调优打下坚实的基础。
|
1月前
|
PHP 开发者
深入理解PHP7的返回类型声明
【2月更文挑战第29天】 在PHP 7中,一个新的特性被引入,即返回类型声明。这是一个强大的工具,它允许开发者明确指定函数或方法应返回的数据类型。本文将探讨这一特性的基本用法,以及如何利用它来提高代码的可读性和健壮性。
|
1月前
|
数据采集 前端开发 PHP
深入PHP内核:探索高性能异步编程
【2月更文挑战第24天】在现代Web开发中,提供快速响应和高并发处理能力是至关重要的。传统的同步阻塞模型已无法满足现代互联网服务的需求。本文将深入探讨PHP语言中的异步编程概念,介绍其原理、实现方式以及如何通过异步编程提升应用性能。我们将剖析PHP的多线程扩展,如pthreads,以及事件驱动编程模型,重点关注它们在处理大量并发连接时的优势和潜在问题。此外,文中还将展示如何使用Swoole等高级框架来构建高效的异步应用。最后,我们将讨论异步编程在实际应用中的挑战与未来发展趋势。
16 1
|
2天前
|
PHP 开发者
深入理解PHP7的返回类型声明
【4月更文挑战第25天】在PHP7中,引入了返回类型声明,这是一个重要的新特性。本文将详细介绍什么是返回类型声明,以及如何在PHP7中使用它。我们将探讨其基本语法,以及如何使用返回类型声明来提高代码的可读性和健壮性。
|
2天前
|
PHP 开发者
深入理解PHP7中的返回类型声明
【4月更文挑战第25天】本文将详细解析PHP7中新引入的返回类型声明特性,包括其基本用法、使用场景以及可能遇到的问题。通过实例代码,帮助读者深入理解和掌握这一强大的新特性。
|
2天前
|
存储 缓存 自然语言处理
深入PHP内核:理解Opcode缓存对性能的影响
【4月更文挑战第25天】 在提升PHP应用性能的众多策略中,Opcode缓存技术因其显著的效果和较低的复杂度而备受开发者青睐。本文将深入探讨Opcode缓存机制,解析其对PHP执行效率的提升原理,并通过实验数据展示启用Opcode缓存前后的性能差异。我们还将讨论几种流行的Opcode缓存工具,如APC、OpCache与APCu,并评估它们的优劣及适用场景,帮助开发者根据不同的项目需求做出合适的选择。通过本文,读者不仅能够了解Opcode缓存的工作原理,还能学会如何在实际项目中应用这一技术以优化PHP应用程序的性能。
|
1月前
|
存储 数据处理 PHP
PHP变量类型
PHP变量类型
18 0