php7引用计数,PHP7 引用计数 读书笔记

PHP7 引用计数 读书笔记

每个 PHP 变量存在一个加 "zval" 的变量容器中. 一个 zval 变量容器, 除了包含变量的类型和值, 还包括两个字节的额外信息.

1.is_ref : 是一个 bool 值, 用来标识这个变量是否属于引用集合. 通过这个字节, PHP 引擎才能把普通变量和引用变量区分开来, 由于 PHP 允许用户通过 & 来自定义引用, zval 变量容器中还有一个内部引用计数机制, 来优化内存使用.

2.refcount, 用来表示指向这个 zval 变量容器的变量 (也称为符号 symbol) 个数. 所有的符号存在一个符号表中, 其中每个符号都有作用域, 那些主脚本和每个函数或者方法也都有作用域.

接下来我们通过几个例子来帮助大家理解.(以下代码是在 Linux+php7.1 环境下)

1. 生成一个新的 zval 容器<?PHP

$a='new string';

xdebug_debug_zval('a');

输出结果如下:

ab7653affab982b574eb7acc55df2e04.gif

从结果可以看出 refount = 0,is_ref=0 那怎么理解这个输出结果呢?

(1)is_ref = 0 信息很容易理解,$a 不是一个引用变量自然就是 0

(2)refount 的值怎么也是 0, 因为我们知道在 php7 中对于简单的数据类型, 比如整型, 字符串, 浮点型等简单类型的值是直接存储在 zval 结构里面.

如果把变量 a 赋值给多个变量会怎样?<?PHP

$a="new string";

$c=$b=$a;

xdebug_debug_zval('a');

输出结果如下:

ab7653affab982b574eb7acc55df2e04.gif

发现 refcount 的值还是 0, 三个变量共用 1 个 zval 结构, 没有存符号表. 下面我们再给看下变量被引用后的情况:<?PHP

$a="new string";

$b=&$a;

$c=&$b;

xdebug_debug_zval('a');

xdebug_debug_zval('b');

xdebug_debug_zval('c');

输出结果如下:

ab7653affab982b574eb7acc55df2e04.gif

我们发现三个变量的 refount 和 is_ref 都相同, 那我们来解释下:

1. 当变量被引用后, 原来的 zval 结构会发生变化, PHP 会新增一个_zend_reference 结构, 这个结构会根据值得类型不同而不同.struct_zend_reference{

zend_refcounted_h gc;

zval val;

}

我们来看下 PHP 的具体操作:

(1)PHP 会申请一个 zend_reference 结构

(2)将 zval_reference.value 指向原来的 zval_struct.value

(3)zval_struct.value 的数据类型修改为 zend_refrence

(4)将 zval_struct.value 指向刚刚申请并初始化的 zend_reference

(5)为新变量申请 zval_struct 结构, 将他的 value 指向刚刚创建的 zend_reference

来源: http://www.bubuko.com/infodetail-3382348.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

焦呼?焦矣!

焦了。做了个香蕉蛋糕。总觉得它还没熟&#xff0c;就让它没完没了地烤着。于是焦了。可里面居然还是湿润的。是蛋糕的问题&#xff0c;还是6寸模的问题&#xff0c;还只是人的问题&#xff1f;烤一半时&#xff0c;爹临出门时&#xff0c;过来往上头按了一大拇指。很好&#x…

AJAX(2),我的第一个AJAX程序

首先&#xff0c;在VS2005中新建一个网站&#xff0c;拖入一个Button和Text,设置Button的客户端事件为userCheck(),<asp:TextBox ID"username"runat"server"></asp:TextBox><input type"button"name"check"value"…

[导入]ASP.NET 2.0中Page事件的执行顺序

文章来源:http://blog.csdn.net/21aspnet/archive/2007/03/20/1535517.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/21/816354.html

[导入]C#中TextBox只能输入数字的代码

文章来源:http://blog.csdn.net/21aspnet/archive/2007/03/20/1535640.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/21/816242.html

实验1c语言开发环境使用和数据类型、运算符和表达式

实验结论 由于这一次是第一次做实验有很多东西不熟悉 比如忘记加分号&#xff0c;用中文输入法打不对符号等等。总之经过这实验我学到了很多。#include <stdio.h> int main() {int x;printf("输入一个整数: \n");scanf("%d",&x);// 在处填写相应…

Nhibernate学习起步之many-to-one篇(转)

1. 学习目的: 通过进一步学习nhibernate基础知识&#xff0c;在实现单表CRUD的基础上&#xff0c;实现两表之间one-to-many的关系. 2. 开发环境必要准备 开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition 必要准备: 学习上篇文章单…

关于如何清除某个特定网站的缓存---基于Chrome浏览器

1、清除浏览器缓存 直接在浏览器设置里面清除浏览器的缓存会清除所有网站的缓存信息&#xff0c;这在某些时候是非常不方便的&#xff0c;毕竟不只有测试网站&#xff0c;还会有一些我们不想清除的信息也会被清除掉&#xff1b; 2、通过F12功能去清除浏览器缓存 转载于:https:/…

php中for循环流程图,PHP for循环

PHP for循环可以用来遍历一组指定的次数的代码。如果迭代次数已知&#xff0c;则应优先考虑使用for循环&#xff0c;否则使用while循环。for循环的语法for(initialization; condition; increment/decrement){ //code to be executed }for循环流程图示例代码-<?php for($n1;…

Spring中AOP切面编程学习笔记

注解方式实现aop我们主要分为如下几个步骤&#xff1a;  1.在切面类&#xff08;为切点服务的类&#xff09;前用Aspect注释修饰&#xff0c;声明为一个切面类。  2.用Pointcut注释声明一个切点&#xff0c;目的是为了告诉切面&#xff0c;谁是它的服务对象。&#xff08;此…

SpringCloud的学习记录(1)

最近一段时间重新学习一边SpringCloud&#xff0c;这里简单记录一下。 我用的是IntelliJ IDEA开发工具, SpringBoot的版本是2.1.3.RELEASE。 1. 构建Maven项目 整个的SpringCloud的项目是在Maven项目中的&#xff0c;这个Maven只做容纳其他项目使用, 比如后面Fegin/Config/Zipk…

html5 拖拽上传文件时,屏蔽浏览器默认打开文件

参考&#xff1a; https://www.cnblogs.com/kingsm/p/9849339.html 转载于:https://www.cnblogs.com/cwxwdm/p/10605529.html

php求数组交集的自定义函数,php数组交集函数

在数学中的交集运算&#xff0c;大家在学习的时候还是比较轻松的。我们在php数组里&#xff0c;可以借助array_intersect()函数对两个数组求交集&#xff0c;最后得到一个想要的交集数据。在正式开始array_intersect()使用前&#xff0c;我们需要先对函数的概念、语法、参数、返…

2016 hctf fheap 题解

题目链接 https://github.com/zh-explorer/hctf2016-fheap 题目分析 题目功能只有 malloc 和 free 的功能&#xff0c;查看堆的布局&#xff1a; 全局指针没有置空&#xff0c;导致 uaf 和 double free 漏洞&#xff0c;两种都可以做&#xff0c;但是这题的重点是绕过 PIE。 do…

Docker: Jenkins里的pipeline编写基本技巧

Jenkins里&#xff0c;先新建一个pipeline项目 Pipeline Syntax 在Sample Step里选择需要的插件&#xff0c;如果不存在&#xff0c;就去系统管理&#xff0c;插件管理里&#xff0c;进行安装。 如果源码管理工具用的是git,就在下拉里选择git 如果源码管理用的是svn&#xff0c…

《解剖PetShop》系列之三

《解剖PetShop》系列之三 三、PetShop数据访问层之消息处理 在进行系统设计时&#xff0c;除了对安全、事务等问题给与足够的重视外&#xff0c;性能也是一个不可避免的问题所在&#xff0c;尤其是一个B/S结构的软件系统&#xff0c;必须充分地考虑访问量、数据流量、服务器负荷…

简单理解bash和常规操作

1. 什么是bash&#xff1f; Bash shell是一个命令解释器&#xff0c;它是操作系统的外壳程序&#xff0c;负责处理用户命令与操作系统内核之间的交互&#xff0c;当用户输入一个命令并执行时&#xff0c;shell会把命令解释并传递给内核&#xff0c;然后再把内核输出返回给用户&…

昨夜的雨图片

昨天趟着淹没到屁股的雨水回家的&#xff0c;今天才知道&#xff0c;这是一场非常可怕的暴雨.本来就吓的够戗,现在直接两腿发软&#xff0c;几欲要哭了。想想真是后怕. 朋友说&#xff0c;你可真大胆,那么大雨你也敢趟.其实不是胆大,而是我走着走着水没的越来越往上了.幸亏个子…

ASP如何限定中英文混合的文字输出字数?

1<%2字符串截取函数&#xff0c;用于信息标题 3strWord需要截取的字符串 4intByteLength显示的字节长度&#xff0c;1个汉字两个字节 5intPadDotAmount背截取后尾部补充点的个数 6字符串截取函数&#xff0c;用于信息标题 7Function FixString()Function FixString(ByVal st…

【译】索引进阶(十一):SQL SERVER中的索引碎片【上篇】

原文链接&#xff1a;传送门。 第十章节我们分析了索引的内部结构。有了这些关于索引结构的知识&#xff0c;我们便可以分析索引碎片了&#xff1a;其产生的原因&#xff0c;如何防止&#xff0c;以及何时可以不去关注它们。 一些背景知识 / 复习 以下知识对于理解索引碎片来说…