cow写时赋值
结构体一开始共用, 到某一方要修改值时,才分裂. 这种特点,称为cow , copy on write。如下例子
$a = 3;
$b = $a;
流程如下图
思考:如果a, b指向同一个结构体, 那么,修改a,或b ,对方会不会受干扰?
答: 不会,因为refcount_gc>1时,有一方修改时,将会产生结构分裂(cow)
$a = 3;
$b = $a;
$b = 5;
流程如下图:
引用赋值
$a = 3;
$b = &$a;
流程如下图:
$a = 3;
$b = &$a;
$b = 5;
流程如下图:
$a = 3;
$b = $a;
$c = &$a;
$c = 5;
echo $a , $b , $c; // 5 3 5
分析:
$a = 3;
/**
{
value:3
refcount_gc:1
is_ref_gc:0
}
**/
$b = $a;
/**
{
value:3
refcount_gc:2
is_ref_gc:0
}
**/
$c = &$a;
/**
不会如下面一样变,否则$b会受干扰。下面的变化是错的
{
value:3
refcount_gc:3
is_ref_gc:1
}
**/
/**
会发生什么?
在is_ref_gc 由0变成1过程中,如果refcount_gc>1,将会强制分裂。如下面
b分裂一份结构体
{
value:3
refcount_gc:1
is_ref_gc:0
}
a,c
{
value:3
refcount_gc:2
is_ref_gc:1
}
**/
$c = 5;
echo $a , $b , $c; // 5 3 5