让我们以此代码为基础:(引用文档)
$a = new ArrayObject();
$a['ID'] = 42;
$b = &$a['ID'];
$c = $a;
xdebug_debug_zval('a');
xdebug_debug_zval('b');
xdebug_debug_zval('c');
这给出了:
a:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=2, is_ref=1),int 42
b:
(refcount=2, is_ref=1),int 42
c:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=2, is_ref=1),int 42
正如您所说:
$a
是一个对象,$b
是$a['ID']
($a['ID']
和$b
: refcount=2, is_ref=1
) 的引用,并且 $c是作为引用的复制(从 PHP5 开始),所以 $c 是 $a 的引用(它现在是同一个对象refcount=2, is_ref=0
:)
如果我们这样做:$c['ID'] = 37;
我们得到:
a:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=1, is_ref=0),int 37
b:
(refcount=1, is_ref=0),int 42
c:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=1, is_ref=0),int 37
$c['ID']
被分配了一个新的int
so =>
$b
变得独立(refcount=1
和is_ref=0
),以及$a['ID']
和$c['ID']
BUT as $c
and aredependent $a
,取相同$a['ID']
的$c['ID']
值 37。
现在,让我们使用基本代码,我们这样做:$c['ID'] &= 0;
更新:出乎意料,我们得到:
a:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=2, is_ref=1),int 0
b:
(refcount=2, is_ref=1),int 0
c:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=2, is_ref=1),int 0
而不是:(如果$c['ID'] = $c['ID'] & 0;
:)
a:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=1, is_ref=0),int 0
b:
(refcount=1, is_ref=0),int 42
c:
(refcount=2, is_ref=0),
object(ArrayObject)[1]
public 'ID' => (refcount=1, is_ref=0),int 0
ArrayObject 实现 ArrayAccess 所以:
如评论中所述并在此处记录:
直接修改是完全替换数组维度的值,如 $obj[6] = 7。另一方面,间接修改仅更改部分维度,或尝试通过引用来分配维度另一个变量,如 $obj[6][7] = 7 或 $var =& $obj[6]。使用 ++ 的增量和使用 -- 的减量也以需要间接修改的方式实现。
一个可能的答案:
“组合运算符(+=、-=、&=、|=)可以以相同的方式工作(间接修改。)”:
refcount
并且is_ref
不受影响,因此(在我们的例子中)所有相关变量的值都会被修改。( $c['ID']
=> $a['ID']
=>$b)