PHP是动态类型语言,是使用静态类型的C语言编写的。PHP的类型系统是Zend引擎实现的。

在Zend/zend.h文件中,有如下代码,定义了一些结构体:

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;

} 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_struct就是用于在PHP内核中表示变量的,包含4个成员变量:

value:变量的值

refcount__gc:变量引用数

type:变量的类型

is_ref__gc:变量是否被引用

_zval_struct的value成员变量的类型是union _zvalue_value,所以PHP能够实现动态类型。一个变量的类型通过其对应结构体的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

#define IS_CONSTANT 8

#define IS_CONSTANT_ARRAY 9

#define IS_CALLABLE 10

Zend引擎是通过宏来对访问变量的成员变量,相关宏定义如下:

#define Z_LVAL(zval) (zval).value.lval

#define Z_BVAL(zval) ((zend_bool)(zval).value.lval)

#define Z_DVAL(zval) (zval).value.dval

#define Z_STRVAL(zval) (zval).value.str.val

#define Z_STRLEN(zval) (zval).value.str.len

#define Z_ARRVAL(zval) (zval).value.ht

#define Z_OBJVAL(zval) (zval).value.obj

#define Z_TYPE(zval) (zval).type

php 变量源码,PHP源码中变量存储方式相关推荐

  1. C语言的数据类型大全,整型数据在内存中的存储方式

    一.数据类型 通过长时间的学习C语言以及代码的编写,我掌握了很多很多的数据类型,下面就给大家罗列一下. 1.内置数据类型 char        //字符数据类型--                  ...

  2. C/C++浮点数在内存中的存储方式《转》

    那天有人在汇编群里有人问了一个 #include <iostream> #include <stdio.h> using namespace std; int main() { ...

  3. 用户密码在后台数据库中加密存储方式

    常见的用户密码在后台数据库中加密存储方式 如何安全的存储用户密码 常见登录密码加密方式 JavaScript逆向实战:admin加密成WaQ7xbhc9TefbwK是什么加密算法?逆向思维考验.详细流 ...

  4. C/C++中涉及存储方式的关键字:auto,static,register,extern2009-01-22 11:23auto关键字:

    C/C++中涉及存储方式的关键字:auto,static,register,extern 2009-01-22 11:23 auto关键字: auto对象和变量被存储在栈中,它的生命周期仅存在于它的声 ...

  5. c++全局类对象_C++ 类在内存中的存储方式(一)

    说了这么久的 C++ 终于说到类了,还是从内存出发来讨论一下 C++ 的类在内存中的存储方式(之前写过一篇内存对齐的文章,类同样在一定程度上遵循内存对齐原则,不过比结构体复杂一下) 如有侵权,请联系 ...

  6. JavaScript中数据在内存中的存储方式

    JavaScript中数据在内存中的存储方式 1.js数据类型分类 简单数据类型:Number.String.Boolean.Undefined.Null 复杂数据类型:Object.Array.Fu ...

  7. c语言double数据存储形式,C语言 float、double数据在内存中的存储方式

    float在内存中占4个字节(32bit),32bit=符号位(1bit)+指数位(8bit)+底数位(23bit) 指数部分 指数位占8bit,可以表示数值的范围是0-(表示0~255一共256个数 ...

  8. 【C语言】浮点型数据在内存中的存储方式

    目录 一. 前言 二. 问题的引出 三. 两类浮点型数据(float.double)在内存中的存储方式 3.1 两类浮点型数据的存储模型 3.1.1 浮点型数据数值读取的通用模型 3.1.2 floa ...

  9. IEEE754标准: 浮点数在内存中的存储方式

    一. 什么是IEEE754标准 我们知道, 计算机内部实际上只能存储或识别二进制. 在计算机中, 我们日常所使用的文档, 图片, 数字等, 在储存时, 实际上都要以二进制的形式存放在内存或硬盘中, 内 ...

  10. 【chatGPT】01 数组、二维数组在不同语言中的存储方式

    问:数组在C++中的存储方式是什么?Java呢?Python呢?可以举例吗? C++ 在C++中,数组是连续分配的内存单元,具有相同的类型和大小. C++会将数组的第一个元素存储在指向数组的指针中,因 ...

最新文章

  1. 用C#去除代码的SourceSafe管理
  2. server缺少sqlexpress sql_SQL Server----解决SQL Server 配置管理器不见了
  3. 子段乘积(逆元费马小定理)+线段树做法
  4. 用Leangoo敏捷看板工具管理 产品线路图
  5. Android界面性能调优手册
  6. ElasticSearch 6.x 学习笔记:12.字段类型
  7. WebRTC拥塞控制算法——GCC介绍
  8. 剖析Picasso中的内存缓存机制——LruCache
  9. junit白盒测试 案例_JUnit通过失败测试案例
  10. 互联网日报 | 美团门票单日入园人次破500万;蔚来用户累计换电百万次;2020诺贝尔生理学或医学奖揭晓...
  11. hiredis源码分析与简单封装
  12. Unity 叉乘 vector3 四元数 和声音组件
  13. java 获取泛型_聊聊Java泛型擦除那些事
  14. Apache 软件基金会成立 20 周年
  15. 图书管理系统源代码<Java>(带文字讲解)(javase)
  16. 9篇前沿文章 | 一览肿瘤基因组及多组学思路
  17. android移动应用开发实践教程,分享一些行业经验,成功入职阿里
  18. 饥荒服务器物品指令,流年饥荒控制台指令全+物品大全+服务器管理命令大全.docx...
  19. Galaxy数据统计平台(一)
  20. 6篇论文入选NIPS 2018,这位中国小哥的开挂人生

热门文章

  1. BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)
  2. java 小球抛物线_关于【愤怒的小鸟】其中的算法(自由落体,抛物线,碰撞,反弹)...
  3. Oracle数据库日常管理之数据备份,恢复及迁移 (第五讲 )
  4. Silverlight 视频学习札记(一)
  5. TCP/IP和HTTP的不同之处
  6. [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之十二:在GridView控件中使用TemplateField
  7. php软件开发--tp5
  8. 小白python教学视频教程_小白零基础入门Python开发全套完整版
  9. 社区发现 实践_实践社区可以为您的组织做什么
  10. php框架和不用框架_如何选择一个PHP框架