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 防恶意刷新实现代码
May 16 PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 PHP
php生成rss类用法实例
Apr 14 PHP
php中smarty模板条件判断用法实例
Jun 11 PHP
php中header设置常见文件类型的content-type
Jun 23 PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
Jul 13 PHP
php加密之discuz内容经典加密方式实例详解
Feb 04 PHP
Laravel中任务调度console使用方法小结
May 07 PHP
php使用imagecopymerge()函数创建半透明水印
Jan 25 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
Apr 16 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如何得到当前页和上一页的地址?
2006/11/27 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
jQuery操作checkbox选择(list/table)
2013/04/07 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
2016/09/04 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
python安装以及IDE的配置教程
2015/04/29 Python
Python递归遍历列表及输出的实现方法
2015/05/19 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python入门之三角函数全解【收藏】
2017/11/08 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
北承题目(C++)
2012/05/16 面试题
前台接待员岗位职责
2015/04/15 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
创业计划书之美甲店
2019/09/20 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
html css3不拉伸图片显示效果
2021/06/07 HTML / CSS