PHP垃圾回收机制引用计数器概念分析


Posted in PHP onJune 24, 2013

如果你安装了xdebug,就可以用xdebug_debug_zval()显示“zval”的信息了。如下:

<?php
$str = "3water.com";
xdebug_debug_zval('str');

结果:

str:
(refcount=1, is_ref=0),
string '3water.com' (length=10)

只有当变量容器在”refcount“变成0时就被销毁.当你unset()一个变量时,想要的“zval”中refcount就会减1,再来说说前几天遇到的unset引用问题:

<?php
$a = "aaa";
$b = & $a;
unset($a);
//echo $b; //这里依然会输出aaa,用xdebug_debug_zval打印你就知道为什么了
xdebug_debug_zval("b");

结果:

b:
(refcount=1, is_ref=0),string 'aaa' (length=3)
继续说引用计数器问题,对于array和object符合类型情况又不一样了:

<?php
$arr = array( 'a' => 'aaa', 'b' => "bbb" );
xdebug_debug_zval( 'arr' );
$arr['aaa'] = $arr['a'];
xdebug_debug_zval( 'arr' );
?>

结果:

arr:
(refcount=1, is_ref=0),
array
  'a' => (refcount=1, is_ref=0),string 'aaa' (length=3)
  'b' => (refcount=1, is_ref=0),string 'bbb' (length=3)
arr:
(refcount=1, is_ref=0),
array
  'a' => (refcount=2, is_ref=0),string 'aaa' (length=3)
  'b' => (refcount=1, is_ref=0),string 'bbb' (length=3)
  'aaa' => (refcount=2, is_ref=0),string 'aaa' (length=3)

可以看到看到原有的数组元素和新添加的数组元素关联到同一个"refcount"2的zval变量容器.这里我也只是起到抛砖引玉的作用。

具体关于PHP引用计数器可以参照手册:http://php.net/manual/zh/features.gc.refcounting-basics.php

PHP 相关文章推荐
php 日期时间处理函数小结
Dec 18 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
比较详细PHP生成静态页面教程
Jan 10 PHP
微信公众号开发之微信公共平台消息回复类实例
Nov 14 PHP
php自动获取关键字的方法
Jan 06 PHP
php找出指定范围内回文数且平方根也是回文数的方法
Mar 23 PHP
PHP读书笔记_运算符详解
Jul 01 PHP
PHP中new static()与new self()的比较
Aug 19 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
详解thinkphp中的volist标签
Jan 15 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
PHP随机字符串生成代码(包括大小写字母)
Jun 24 #PHP
PHP 读取大文件的X行到Y行内容的实现代码
Jun 24 #PHP
解析在PHP中使用全局变量的几种方法
Jun 24 #PHP
探讨:array2xml和xml2array以及xml与array的互相转化
Jun 24 #PHP
解析Ubuntu下crontab命令的用法
Jun 24 #PHP
关于crontab的使用详解
Jun 24 #PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
Jun 24 #PHP
You might like
PHP面向对象详解(三)
2015/12/07 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
基于jquery实现图片上传本地预览功能
2016/01/08 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
js 显示日期时间的实例(时间过一秒加1)
2017/10/25 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
详解tween.js 中文使用指南
2018/01/05 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
vue实现树状表格效果
2020/12/29 Vue.js
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
Python中join和split用法实例
2015/04/14 Python
django Serializer序列化使用方法详解
2018/10/16 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
python实现吃苹果小游戏
2020/03/21 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
浅谈CSS3 box-sizing 属性 有趣的盒模型
2019/04/02 HTML / CSS
农民工工资承诺书范文
2014/03/31 职场文书
房屋买卖协议样本
2014/11/16 职场文书
2014年教研工作总结
2014/12/06 职场文书
安全责任书
2015/01/29 职场文书
开除员工通知
2015/04/22 职场文书
文艺演出主持词
2015/07/01 职场文书
MySQL查询日期时间
2022/05/15 MySQL