在函数传递参数时有引用计数增加操作,举个例子:
在 第1行 时 符号 a 指定 的zval容器 refcount 为 1
在 第2行 时 符号 a 指定 的zval容器 refcount 为 2,is_ref 为 1 (仅表示真或者假) 符号 b 与 a 指向 相同的zval容器.
在 第3行 时 由于 a,b 指定的是一个容器,而 $c = $a 也没有使用 & 符,所以 这里的 符号c 分配出一个新的容器,类型,与值 同 a,b指向的容器。 是新分配出来的,所以 符号 a 指向的 zval容器 的refcount 值没有增加。我感觉这里没必要说为什么会分配出新的容器了,试想一下,如果也是指定同一个容器的话,改边 c 的值,那么 a,b 也会受到影响,这样就乱套了。
在 第 4 行 ,由于 函数传递参数也会是引用增加,所以 这里 可以理解为 $d = $a , 所以和第3行的情况一样,a 指向 的 zval 的 refcount 值也没有增加。
那么根据这四行可以看出 现在 符号a指向的zval容器的refcount 为 2 ,is_ref 为 1 , 但是debug_zval_dump()函数打印出的为什么是 string(1) "a" refcount(1) ? 因为 debug_zval_dump() 函数只输出了 php 内部实现的引用计数机制,如果程序中使用 & 取地址符 不被算在内,同样它也没有输出is_ref 的值(is_ref 表示该容器是否被引用), 所以 输出 refcount(1) .