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实现文件上传二法
Oct 09 PHP
PHP 和 XML: 使用expat函数(三)
Oct 09 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
Jul 04 PHP
PHP 透明水印生成代码
Aug 27 PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
Aug 01 PHP
PHP文件读取功能的应用实例
May 08 PHP
PHP MPDF中文乱码的解决方式
Dec 08 PHP
Twig模板引擎用法入门教程
Jan 20 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 PHP
laravel 去掉index.php伪静态的操作方法
Oct 12 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面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
php动态变量定义及使用
2015/06/10 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
javascript prototype原型操作笔记
2009/12/07 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
基于jquery循环map功能的代码
2011/02/26 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
2017/10/25 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
Antd中单个DatePicker限定时间输入范围操作
2020/10/29 Javascript
使用python实现strcmp函数功能示例
2014/03/25 Python
理解Python中的With语句
2015/02/02 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
惠普香港官方商店:HP香港
2019/04/30 全球购物
MYSQL基础面试题
2012/05/13 面试题
2014年超市员工工作总结
2014/11/18 职场文书
2014全年工作总结
2014/11/27 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
深度学习小工程练习之垃圾分类详解
2021/04/14 Python
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server
win sever 2022如何占用操作主机角色
2022/06/25 Servers