`

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

分享到:
评论

相关推荐

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

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

    PHP调试技术手册.pdf

    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开发者

    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垃圾回收机制引用计数器概念分析

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

    PHP线程的内存回收问题

    refcount:引用技术器,可以理解为指向该个容器的指针个数吧。 is_ref:是否被引用(只可能是0或者1) 赋值的流程: <?php $a = 'aa'; xdebug_debug_zval(a); //(refcount=1, is_ref=0),string 'aa' (length=6) ...

    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赋值的内部是如何跑的详解

    /* 变量的值 */zend_uint refcount__gc;zend_uchar type; /* 变量当前的数据类型 */zend_uchar is_ref__gc;};typedef struct _zval_struct zval;//在Zend/zend_types.h里定义的:typedef unsigned int zend_uint;

    深入解析PHP的引用计数机制

    PHP的变量声明并赋值后,变量名存在符号表中,而值和类信息存在zval中,zval中包含四个变量,is_ref,refcount,value,type,zval源码如下复制代码 代码如下:struct _zval_struct { /* Variable information */ ...

    PHP源码分析之变量的存储过程分解

    ZVAL_LONG(c_var,1) ;//赋值  ZEND_SET_SYMBL( EG(active_symbol_table), ” php_var “, c_var);//注册到全局变量符号表 一.首先看第一行: zval* c_var;//申明一个zval指针c_var; zval的结构如下: 复制代码 ...

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

    首先我们回顾一下zval的结构:复制代码 代码如下:struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount; zend_uchar type; /* active type */ zend_uchar is...

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

    由于大量的细节描述,本文将会分成两个部分:第一部分主要描述 zval(zend value) 的实现在 PHP5 和 PHP7 中有何不同以及引用的实现。第二部分将会分析单独类型(strings、objects)的细节。 PHP5 中的 zval PHP5 中 ...

    你应该知道PHP浮点数知识

    PHP是一种弱类型语言, 这样的特性, 必然要求有无缝透明的隐式类型转换, PHP内部使用zval来保存任意类型的数值, zval的结构如下(5.2为例): 复制代码 代码如下: struct _zval_struct {  /* Variable information */ ...

    PHP源代码数组统计count分析

    数组采用的是hash表的方式去保存(大家知道hash保存的地址有效的减少冲突-hash散列表的概念你懂的),而在php中的结构体上表现如下: 复制代码 代码如下: //文件1:zend/zend.h /* * zval */ typedef struct _zval_...

    深入PHP变量存储的详解

    1.1.1 zval结构Zend使用zval结构来存储PHP变量的值,该结构如下所示:复制代码 代码如下:typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; ...

    彻底搞懂PHP 变量结构体

    PHP5 中的 zval // 1. zval typedef struct _zval_struct { zvalue_value value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc; } zval; // 2. zvalue_value typedef union _zvalue_value ...

    掌握PHP垃圾回收机制详解

    php的垃圾回收机制可以简单总结为 引用计数 写时复制 COW机制...通过这个字节,php引擎才能把普通变量和引用变量区分开来 refcount 用以表示指向这个zval变量容器的变量个数 PHP5 中的引用计数在PHP5中,zval 的内存是

    深入解析PHP垃圾回收机制对内存泄露的处理

    然后执行第二行,$a将会从符号表中被删除,同时指向的zval的refcount–,此时refcount=1,因为refcount!=0,故此zval不会被当做垃圾回收,但是此时我们却失去了$a[2]指向这个zval的入口,因此这个zval成了一块内存...

    简单谈谈PHP的垃圾回收机制

    1、每一个变量定义时都保存在一个叫zval的容器里面,这里面包含了数量的类型和和值,还包含了一个refcount(理解为存在几个变量个数)和is_ref(理解为是否为引用变量)两个额外信息,当变量被引用一次refcount就会+...

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

    1.1.3 print_r、var_dump(var_export)、debug_zval_dump ......................................................................... 3 1.2 错误控制和日志记录调试 ...............................................

Global site tag (gtag.js) - Google Analytics