Home  >  Article  >  Backend Development  >  学习PHP垃圾回收机制了解引用计数器的概念

学习PHP垃圾回收机制了解引用计数器的概念

WBOY
WBOYOriginal
2016-06-23 14:37:42841browse

php变量存在一个叫"zval"的变量容器中,"zval"变量容器包括含变量的类型和值,还包括额外的两个字节信息,分别是“is_ref”表示变量是否属于引用,“refcount”指向这个zval变量容器的变量个数。

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

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

  

结果:

str:

(refcount=1, is_ref=0),

string 'phpddt.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	/** by www.phpddt.com */	$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

欢迎转载! 原文地址:  http://www.phpddt.com/php/gc-refcounting-basics.html ,转载请注明地址,谢谢!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn