PHP中为了节省内存,在变量赋值时使用了写时复制。看一下的代码:
<?php
$a = array();
xdebug_debug_zval('a');
$b = $a;
xdebug_debug_zval('a');
$b[0] = 1;
xdebug_debug_zval('a');
运行结果如下:
a: (refcount=1, is_ref=0)=array ()
a: (refcount=2, is_ref=0)=array ()
a: (refcount=1, is_ref=0)=array ()
把a的值赋值给b时并不是保存了两份两份拷贝,而是复用了a的值,只有在b的值改变的时候才进行复制。
再看一下如下的代码:
<?php
$a = array(0, 1, 2);
xdebug_debug_zval('a');
$b = $a;
xdebug_debug_zval('b');
$b[3] = 3;
xdebug_debug_zval('a');
xdebug_debug_zval('b');
结果如下,是不是就很好理解了呢。
a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)=0, 1 => (refcount=1, is_ref=0)=1, 2 => (refcount=1, is_ref=0)=2)
b: (refcount=2, is_ref=0)=array (0 => (refcount=1, is_ref=0)=0, 1 => (refcount=1, is_ref=0)=1, 2 => (refcount=1, is_ref=0)=2)
a: (refcount=1, is_ref=0)=array (0 => (refcount=2, is_ref=0)=0, 1 => (refcount=2, is_ref=0)=1, 2 => (refcount=2, is_ref=0)=2)
b: (refcount=1, is_ref=0)=array (0 => (refcount=2, is_ref=0)=0, 1 => (refcount=2, is_ref=0)=1, 2 => (refcount=2, is_ref=0)=2, 3 => (refcount=1, is_ref=0)=3)