background image

从本质上来说,这也可以看作是一种 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 副本。
全过程如下所示: