答案很简单,正如您对问题的评论所解释的。虽然,我觉得我明白你的混乱来自哪里,所以让我们来解决这个问题。 :D
首先,您为变量分配一个值,内部PHP将其存储在内存段中,并增加引用此地址的变量的计数器。 (Ref count = 1)。所有的直接向前直到这一点。
然后,您重新使用变量将引用(C语言中的指针)存储到此内存地址。 PHP手册解释为存储对变量的引用,使非C程序员更容易,这是(我认为)你的困惑来自哪里。没有这样的东西,作为内部变量的引用,只是变量所连接的数据。由于您重新使用变量存储此引用,引用计数不会增加:仍然只有一个变量指向该内存段。但是,它不再是普通的PHP变量,而是一个引用(指针)的数据。
编辑,添加:
另一种完成相同结果的方式是使用两个变量,然后取消设置第一个变量。代码示例:
$a = 100; // refcount += 1
xdebug_debug_zval ('a'); // refcount=1,is_ref=0 -> zval {value=100,type=int (addr=0x78765asd)}
$b =& $a; // refcount += 1
xdebug_debug_zval ('a') // refcount=2,is_ref=0 -> zval {value=100,type=int (addr=0x78765asd)}
xdebug_debug_zval ('b') // refcount=2,is_ref=1 -> zval {value=100,type=int (addr=0x78765asd)}
unset ($a); // refcount -= 1
xdebug_debug_zval ('b') // refcount=1,is_ref=1 -> zval {value=100,type=int (addr=0x78765asd)}
仅使用一个变量将两个操作合并为一个,而不会破坏数据。因此:1变量(refcount = 1),它是数据本身的引用(is_ref = 1)。
正如我们试图向你解释的那样,这个混乱源于事实,即原始问题背后的前提是有缺陷的:你不是在这些例子中引用一个变量,而是引用一个内存区域,其中包含最初关联的数据与所述变量。所以你要覆盖一个(原来的)“hardlink”,另一个。唯一的区别是后者被标记为因为内部PHP的原因。 (在引用计数> 1的情况下,引用不会被复制)