Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个数组如何在PHP中共享zval容器?_Php_Memory - Fatal编程技术网

两个数组如何在PHP中共享zval容器?

两个数组如何在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)。到现在为止,一直

我正在学习PHP中内存管理的基础知识,我发现它非常有趣。不幸的是,内存管理的内部结构似乎随着PHP版本的变化而变化,因此与解释我们应该期望的结果的不同资源相比,我并不总是理解
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'之后
do
a
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的共享。