`

debug_zval_dump()中参数是引用的refcount为1

    博客分类:
  • php
 
阅读更多

 

在函数传递参数时有引用计数增加操作,举个例子:

  1. 1) $a = 'a';
  2. 2) $b = &$a;
  3. 3) $c = $a;
  4. 4) debug_zval_dump($a); // string(1) "a" refcount(1)

在 第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) .

分享到:
评论

相关推荐

    PHP-Debug-Manual-public

    debug_zval_dump函数除了提供变量信息外,还能显示变量的引用计数(refcount),这是理解PHP中的copy-on-write(写时复制)机制的一个重要参考。debug_print_backtrace函数能够打印程序的调用栈信息,这有助于开发者...

    PHP中文调试技术手册(PHP-Debug-Manual-public)

    debug_zval_dump则提供变量的引用计数(refcount),它是PHP的copy-on-write机制的体现。 debug_print_backtrace可以查看程序的调用栈,便于在出错时了解函数调用的上下文。 1.2 错误控制和日志记录调试 在进行...

    浅析PHP原理之变量分离/引用(Variables Separation)

    在这个例子中,`$var_dup`的值仍然是"laruence",而`$var`指向的新zval值为1,两者不再共享同一个zval。 这种机制避免了不必要的内存分配,提高了性能,特别是在处理大量数据时。然而,当并发修改变量的情况增多,...

    php调试手册

    - **`debug_zval_dump`**: 除了输出数据类型和值之外,还会显示引用计数(refcount),这对于理解PHP内部的工作机制非常有用。 ```php debug_zval_dump($array); ``` **1.2 错误控制和日志记录调试** **1.2.1 ...

    php调试程序技术

    其中,`debug_zval_dump`是一个特别的函数,它不仅像`var_dump`那样显示变量的值,还会提供引用计数(refcount),这对于理解PHP的写时复制(Copy-On-Write)机制至关重要。另一个有用的函数是`debug_print_...

    PHP调试技术手册.pdf

    - **1.1.3 print_r、var_dump(var_export)、debug_zval_dump** - **print_r 和 var_dump:** - **概述:** 用于输出数组或对象等复杂数据结构的值,帮助开发者了解数据的具体内容。 - **应用场景:** 调试接口...

Global site tag (gtag.js) - Google Analytics