变量存储

php的变量使用一个结构体 zval来保存的,在Zend/zend.h中我们可以看到zval的定义

struct _zval_struct {
/* Variable information */
zvalue_value value;    /* 变量的值 */
zend_uint refcount__gc; /* 变量被指向次数,指向一次+1 */
zend_uchar type;    /* 变量当前的数据类型 */
zend_uchar is_ref__gc; /* 涉及到垃圾回收,以后补充 */
};

变量类型
1、整型/浮点/长整型/bool值
2、字符串
3、数组/关联数组
4、对象
5、资源

typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct { /*字符串*/
char *val; /*值*/
int len; /*字符串长度,因为这里存储字符串长度,所以在使用 strlen函数求长度是直接返回,效率非常快*/
} str;
HashTable *ht; /* hash table value PHP数组底层其实是一个hashtable */
zend_object_value obj; /*对象*/
zend_ast *ast;
} zvalue_value;

底层代码变量类型定义

/* data types */
/* All data types <= IS_BOOL have their constructor/destructors skipped */
#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_AST 9
#define IS_CALLABLE 10 #define IS_CONSTANT_TYPE_MASK 0x00f
#define IS_CONSTANT_UNQUALIFIED 0x010
#define IS_LEXICAL_VAR 0x020
#define IS_LEXICAL_REF 0x040
#define IS_CONSTANT_IN_NAMESPACE 0x100 #define IS_CONSTANT_TYPE(type) (((type) & IS_CONSTANT_TYPE_MASK) >= IS_CONSTANT && ((type) & IS_CONSTANT_TYPE_MASK) <= IS_CONSTANT_AST)

当我们在php代码中写$a = 3;
内存存储方式为:

使用xdebug_debug_zval('a');查看赋值时底层的变化
运行结果为:a: (refcount=1,is_ref=0)=3

当再赋值$b = $a;时
使用xdebug_debug_zval('a');
使用xdebug_debug_zval('b');
运行结果为:a: (refcount=2,is_ref=0)=3
      b: (refcount=2,is_ref=0)=3

当再给$b赋值,$b = 5;,这个时候用到了php的特性,写时复制(Copy On Write,简称COW,因为两者有一方修改值的时候,才会进行分裂),会赋值出来一份,不使用同一个内存块。
使用xdebug_debug_zval('a');
使用xdebug_debug_zval('b');
运行结果为:
a: (refcount=1,is_ref=0)=3
b: (refcount=1,is_ref=0)=5

最新文章

  1. 使用VS Code开发ASP.NET 5 应用程序
  2. Python画图笔记
  3. 网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
  4. 疯狂的ASP.NET系列-第一篇:啥是ASP.NET
  5. css3写出0.5px的边框
  6. Oracle从11.2.0.2开始,数据库补丁包是一个完整安装包(转)
  7. C#一些小技巧(二)
  8. 网页搜索功能 多表搜索sql
  9. 2014牡丹江区域赛H(特里)ZOJ3826
  10. 【Java每日一题】20170111
  11. 一种比较简单的在USB U盘中访问nandflash的方法
  12. winfrom DataSet和实体类的相互转换
  13. Android开发——Notification通知的各种Style详解
  14. AI SegNet
  15. 【原创】大数据基础之Ambari(3)通过Ambari部署Airflow
  16. HOU 1012
  17. jQuery使用(四):DOM操作之查找兄弟元素和父级元素
  18. linux学习之软件包安装
  19. 以ActiveMQ为例JAVA消息中间件学习【4】——消息中间件实际应用场景
  20. jmeter作用域规则

热门文章

  1. 服务器(Linux)上运行python总结
  2. PHP 根据 IP 获取定位数据
  3. Qt编写自定义控件42-开关按钮
  4. 【422】Insert often-used pieces of text in gedit
  5. Web登录验证之 Shiro
  6. Django之Form、跨站请求以及cookie、session
  7. 【Leetcode_easy】633. Sum of Square Numbers
  8. 极客时间-左耳听风-程序员攻略-UI/UX设计
  9. Vector3.Angle问题
  10. Navicat安装及使用