两个数组如何在PHP中共享zval容器?
我正在学习PHP中内存管理的基础知识,我发现它非常有趣。不幸的是,内存管理的内部结构似乎随着PHP版本的变化而变化,因此与解释我们应该期望的结果的不同资源相比,我并不总是理解两个数组如何在PHP中共享zval容器?,php,memory,Php,Memory,我正在学习PHP中内存管理的基础知识,我发现它非常有趣。不幸的是,内存管理的内部结构似乎随着PHP版本的变化而变化,因此与解释我们应该期望的结果的不同资源相比,我并不总是理解xdebug\u debug\u zval返回的结果。这没关系,因为我主要对全局感兴趣,但它阻止我运行测试来测试我的知识 我想回答的问题很简单: $a=array(1,2); $b=$a; $b[0]='foo'; $b[]='bar'; 矫揉造作后,a和b符号都指向相同的zval(refcount=2)。到现在为止,一直
xdebug\u debug\u zval
返回的结果。这没关系,因为我主要对全局感兴趣,但它阻止我运行测试来测试我的知识
我想回答的问题很简单:
$a=array(1,2);
$b=$a;
$b[0]='foo';
$b[]='bar';
矫揉造作后,a
和b
符号都指向相同的zval(refcount=2
)。到现在为止,一直都还不错。但是在$b[0]='foo'之后代码>指令,a
和b
是否仍然指向相同的zval?如何处理修改
同样,在$b[]='bar'之后
doa
和b
仍然指向与正在创建的新节点相同的zval(即创建一个新的zval以存储3
指向的'bar'
,该键添加到$b
)
运行xdebug\u debug\u zval('a')
和xdebug\u debug\u zval('b')
分别给我
a: (refcount=2, is_ref=0)=array (0 => (refcount=0, is_ref=0)=1, 1 => (refcount=0, is_ref=0)=2, 2 => (refcount=0, is_ref=0)=3)
b: (refcount=1, is_ref=0)=array (0 => (interned, is_ref=0)='foo', 1 => (refcount=0, is_ref=0)=2, 2 => (refcount=0, is_ref=0)=3, 3 => (interned, is_ref=0)='bar')
我不知道该如何解释,也不知道这是否回答了我的问题。我可以看到a
和b
指向同一个zval数组,但仅此而已。如何处理这些差异
所以我的问题是,PHP是否通过共享由符号a
和b
指向的节点(zval)以及通过添加节点(zval)来适应它们之间的差异来处理内存树
非常感谢您的回答,很抱歉我的问题的标题没有很好的表述我想这个博客可以帮上忙。
现在,如果您更改其中一个变量的值,PHP看到refcount大于1,就会复制这个zval,在那里进行更改,并且您的变量将已经指向新的zval
谢谢你的回复。综上所述,我从您的链接和本链接中了解到,本链接的重点是zval的PHP7实现:一旦发生修改,数组就会被复制。没有zval的共享。