从本质上来说,这也可以看作是一种 Copy-On-Write,不仅仅是 value,is_ref 也是受保护
的对象。
整个过程图示如下:
情况 II,看如下 PHP 代码:
<?php
$a
= 1;
$b
= &
$a
;
$c
= &
$b
;
$d
=
$c
;
// 在一堆引用赋值中,插入一个非引用
?>
这段代码的前三句将把 a、b 和 c 指向一个 zval,其 is_ref=1, refcount=3;第四句是个非引
用赋值,通常情况下只需要增加引用计数即可,然而目标 zval 属于引用变量,单纯的增
加引用计数显然是错误的, Zend 的解决办法是为 d 单独生成一份 zval 副本。
全过程如下所示: