php关于引用计数的疑问?
本文介绍了php关于引用计数的疑问?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
在测试php关于引用计数的时候,看到一个变量有一个zval容器。里面包含两个属性 一个refcount 一个是is_ref
$array= array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'array' );
测试数组的引用计数的时候 返回如期的结果
array (refcount=1, is_ref=0),
array (size=2)
'meaning' => (refcount=1, is_ref=0),string 'life' (length=4)
'number' => (refcount=1, is_ref=0),int 42
但是在测试对象的时候。出现一个疑问?
class A{
private $a1;
public $a2;
}
$class1 = new A();
xdebug_debug_zval('class1');
class1:
(refcount=1, is_ref=0),
object(A)[1]
private 'a1' => (refcount=2, is_ref=0),null
public 'a2' => (refcount=2, is_ref=0),null
不是很明白为什么?这里会是2 ?而不是1.而不是像php数组一样。出现预期的refcount为1
而在php官方手册中。关于引用计数的关于符合类型的解释。
php引用计数
像 array和object这样的复合类型时,事情就稍微有点复杂. 与 标量(scalar)类型的值不同,array和 object类型的变量把它们的成员或属性存在自己的符号表中.
解决方案
PHP 5.6.19 显示如下
class X{
private $a;
public $b;
}
$x = new X();
xdebug_debug_zval("x");
(refcount=1, is_ref=0),
object(X)[3]
private 'a' => (refcount=1, is_ref=0),null
public 'b' => (refcount=1, is_ref=0),null
PHP Version:7.0.4
相同代码测试结果
x:
(refcount=1, is_ref=0)
object(X)[3]
private 'a' => (refcount=0, is_ref=0)null
public 'b' => (refcount=0, is_ref=0)null
PHP7中简单值直接使用zval容器存储,不再使用指向zval的指针,
也就是说PHP7操作变量是直接操作zval结构体,简单值不再参与垃圾回收
页不再参与引用计数,简单值得赋值直接拷贝,而不再计算引用计数
echo "<hr>PHP7简单值";
$m = 1;
$n = $m;
xdebug_debug_zval("m");
xdebug_debug_zval("n");
PHP7简单值m:
(refcount=0, is_ref=0)int 1
n:
(refcount=0, is_ref=0)int 1
如果简单值被引用了,则结果如下
echo "<hr>PHP7简单值被引用";
$m = 1;
$n = &$m;
xdebug_debug_zval("m");
xdebug_debug_zval("n");
m:
(refcount=2, is_ref=1)int 1
n:
(refcount=2, is_ref=1)int 1
可见当n引用m后,n、m指向同一个变量,引用计数为2,引用为true
unset($n);
m:
(refcount=1, is_ref=1)int 1
n:
(refcount=0, is_ref=0)*uninitialized*
可见unset掉n后,原变量的引用计数减为1,引用仍为true
``
这篇关于php关于引用计数的疑问?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文