`

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线程的内存回收问题_.docx

    在这种情况下,`refcount` 也会增加,但 `is_ref` 被设置为1,表示这是一个引用。 ``` $a = 'aa'; $xdebug_output = xdebug_debug_zval('a'); // (refcount=1, is_ref=0), string 'aa' (length=2) $b = &$a; $...

    深入理解 PHP7 中全新的 zval 容器和引用计数机制

    仔细一想不难发现问题所在:这些文章大多是 PHP5.x 时代的,而 PHP7 发布后,采用了新的 zval 结构,相关的资料也比较贫瘠,所以我结合一些资料做了一个总结, 主要侧重于解释新 zval 容器中的引用计数机制 ,如有...

    PHP-Debug-Manual-public

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

    PHP调试技术手册pdf版1.0最新版本

    - 1.1.3 `print_r`、`var_dump` (`var_export`)、`debug_zval_dump` - 1.2 错误控制和日志记录调试 - 1.2.1 错误选项控制 - 1.2.2 错误抛出和处理 - 1.2.3 使用错误抑制符 - 1.2.4 日志记录 2. **浏览器调试*...

    PHP调试技术手册1.0.0提高解决出错效率最新版本

    - 1.1.3 `print_r`、`var_dump` (`var_export`)、`debug_zval_dump` 1.2 错误控制和日志记录调试 - 1.2.1 错误选项控制 - 1.2.2 错误抛出和处理 - 1.2.3 使用错误抑制符 - 1.2.4 日志记录 2. 浏览器调试 2.1...

    php调试手册适合新手php开发者

    1.1.3 print_r、var_dump(var_export)、debug_zval_dump 1.2 错误控制和日志记录调试 1.2.1 错误选项控制 1.2.2 错误抛出和处理 1.2.3 使用错误抑制符 1.2.4 日志记录 2 浏览器调试 2.1 页面输出调试 2.2 FirePHP ...

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

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

    PHP垃圾回收机制引用计数器概念分析

    如果你安装了xdebug,就可以用xdebug_debug_zval()显示...当你unset()一个变量时,想要的“zval”中refcount就会减1,再来说说前几天遇到的unset引用问题: 复制代码 代码如下:<?php$a = “aaa”;$b = & $a;unset

    php_python调试工具

    var_dump用于显示变量的类型和值,而debug_zval_dump更进一步,显示了变量的内存引用计数等细节。 Python调试工具: 1. pdb:Python的标准调试器,支持设置断点、单步执行、查看变量值等功能。通过在代码中插入pdb....

    PHP调试技术手册 1.0.rar

    1.1.3 print_r、var_dump(var_export)、debug_zval_dump 1.2 错误控制和日志记录调试 1.2.1 错误选项控制 1.2.2 错误抛出和处理 1.2.3 使用错误抑制符 1.2.4 日志记录 2 浏览器调试 2.1 页面输出调试 2.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_...

    变量在 PHP7 内部的实现(一)

    PHP的变量存储在一个称为zval的数据结构中,其中包含了值(value)、类型(type)、引用计数(refcount)以及一个标志位(is_ref)来指示变量是否通过引用传递。在PHP5中,zval的结构体如下所示: ```c typedef struct _...

    php 手册[学习笔记]

    #### 1.4 `debug_zval_dump` - 用于查看变量的引用次数。 - 示例: ```php $a = 1; $b = &$a; debug_zval_dump($a); // 显示 $a 被引用了两次 ``` ### 2. 错误报告和处理 #### 2.1 `error_reporting` - 通过...

    编写 PHP Extension.doc

    其中,value 是变量的值,refcount 是变量的引用计数,type 是变量的类型,is_ref 是变量是否是引用。 zval 结构 zval 结构体是 PHP 变量的核心结构体,它包含了变量的所有信息。zval 结构体的成员变量包括: * ...

    PHP调试技术手册.pdf

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

    php code camp

    当`is_ref`字段被设置为1时,表明这个`zval`是一个引用。这意味着对这个`zval`所做的任何改变都会影响到所有引用它的变量。 ### 创建自己的PHP5扩展 创建PHP5扩展涉及到以下几个步骤: 1. **创建扩展骨架**:这...

    PHP.chm中文简体

    错误处理和调试是开发者必备的技能,手册会介绍错误报告级别、异常处理、使用var_dump和debug_zval_dump等函数来分析变量状态。另外,手册还会涉及PHP的安全实践,如预防SQL注入、XSS攻击(Cross Site Scripting)...

Global site tag (gtag.js) - Google Analytics