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. variant 字符串数组_VB数组部分核心知识总结
  2. docker from指令的含义_Docker中Dockerfile多From 指令存在的意义
  3. graphpad柱状图怎么加图例_如何用Graphpad prism添加多个图例
  4. 数据库事务原理及并发、死锁
  5. win10 远程出现身份验证错误 要求的函数不受支持
  6. 【数据结构与算法】之深入解析“贪心算法“的原理解析和算法实现
  7. vue的移动app项目中,自定义拖拽指令的问题
  8. python 批量修改密码
  9. oracle导入 不是dba,IMP-00013只有DBA才能导入由其他DBA导出的文件
  10. spring+mybatis+springMVC+redis缓存+mysql+bootstrap+异步提交----联系人小demo
  11. UI设计素材|弹窗设计技巧,快get
  12. SCAN: Structure Correcting Adversarial Network for Organ Segmentation in Chest X-rays(译)
  13. android studio connot resolve
  14. 普通路由器改4g路由器_4G工业路由器在安防领域中的应用
  15. just help me
  16. 大学生常用的pt网站
  17. TYUT太原理工大学2022需求工程考试简答题
  18. 几个网络捕获工具的评价
  19. C语言程序设计(11.28)
  20. 利用Python进行数据分析的学习笔记——chap9

热门文章

  1. 线性代数:线性方程组的解
  2. CloudStack4.10+GlusterFS4.10测试
  3. futureTask的超时原理解析
  4. LNMP环境--搭建Discuz论坛
  5. 乐观锁与悲观锁的应用场景
  6. 转(HP大中华区总裁孙振耀退休感言)
  7. 从WINDOWS日志判断哪块硬盘好坏!!
  8. 高德地图 Android API 的基站定位原理及使用方法
  9. 〖经典〗网页特效汇总实例
  10. python 面试题(2)--- 字符串连接问题