php引用计数器,PHP 引用计数器 通俗版解释_PHP教程

PHP 引用计数器 通俗版解释

概述

最近看PHP中的引用计数器部分,首先被各种绕晕,然后通过看博客和分析后,总结了一个比较通俗的解释,能帮助自己很好地记忆,也希望能帮助到各位读者。这里分享一遍博文,是比较正统的解释:PHP变量之引用(http://hilojack.sinaapp.com/?p=1392)。

建议

研究PHP引用计数器的变化可以通过安装Xdebug扩展来学习,安装后直接调用 xdebug_debug_zval('var') 来看变量 $var的引用计数器情况。

基础知识

谈引用计数器需要对PHP中变量的存储、引用计数的机制有所了解,引用计数当然是节约内存,在不影响语义正确性的前提下,让多个变量符号共享一个内存值空间(又称为变量容器)。引用计数什么时候发生变化:赋值。 赋值又有两种: 值传递赋值和引用赋值。比较难以理解的是引用赋值。引用计数的另一个作用就是指示什么时候可以共用同一空间,什么时候必须进行变量分离(另开辟空间)。

通俗解释

为了便于理解和记忆,本人对赋值中的各种情景给以通俗的解释,不要与现实情况对号入座,

0414454E3-0.gif

& 号是结合,可以相当于结婚,但是PHP中允许多个人一起结婚(即一夫多妻制或一妻多夫制),这个比较变态。 注意结婚必须同居,分居是不行的。除了结婚外还有一种形态叫 合租。合租也是同居,但是没有任何关系,允许多人合租,这个是合情合理的。当然还有一种情况是独居,这个比较容易理解。以下面的例子说明赋值语句与这三种状态对应关系:

情景一:

$a = "a"; // $a 独居, is_ref = 0, refcount = 1;

$b = $a; // $a 与 $b 合租, is_ref = 0, refcount = 2;情景二:

$a = "a"; // $a 独居, is_ref = 0, refcount = 1;

$b = &$a; // $a 与 $b 结婚, is_ref = 1, refcount = 2;上面可以看出, is_ref可以理解为结婚证,=1 表示两个和多个变量是结婚关系, =0没有结婚(可以合租或同居),refcount表示了多少个变量住在一起了,=1表示独居,>1表示多人同居(记住,结婚必须同居,但同居未必是结婚关系)。

下面开始分析赋值时的变量变化关系:

情景一:

$a = "a";  // $a 独居, is_ref = 0, refcount = 1;

$b = $a;   // $a 与 $b 合租, is_ref = 0, refcount = 2;

$va = "b"; // $va 独居, is_ref = 0, refcount = 1;

$vb = $va; // $va 和 $vb 合租, is_ref = 0, refcount = 2;

$a = $va;  // $a是单身,$va也是单身,因此 $a 搬去与 $va 同居,现在$a,$va,$vb三人同居

赋值后:

$a: is_ref = 0, refcount = 3, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 0, refcount = 3, string "xyz"

$vb: is_ref = 0, refcount = 3, string "xyz"

情景二:

$a = "a";  // $a 独居, is_ref = 0, refcount = 1;

$b = &$a;   // $a 与 $b 结婚, is_ref = 1, refcount = 2;

$va = "b"; // $va 独居, is_ref = 0, refcount = 1;

$vb = $va; // $va 和 $vb 合租, is_ref = 0, refcount = 2;

$a = $va;  // $a是已婚, $a 不能随便单独搬出去,赋值会使$va的值拷贝给$a,其他关系不变

$a: is_ref = 1, refcount = 2, string = "xyz"

$b: is_ref = 1, refcount = 2, string = "xyz"

$va: is_ref = 0, refcount = 2, string "xyz"

$vb: is_ref = 0, refcount = 2, string "xyz"

情景三:

$a = "a";  // $a 独居, is_ref = 0, refcount = 1;

$b = &$a;   // $a 与 $b 结婚, is_ref = 1, refcount = 2;

$va = "b"; // $va 独居, is_ref = 0, refcount = 1;

$vb = &$va; // $va 和 $vb 结婚, is_ref = 1, refcount = 2;

$a = $va;  // $a是已婚, 与情景二相同,值拷贝,关系不变

赋值后:

$a: is_ref = 1, refcount = 2, string = "xyz"

$b: is_ref = 1, refcount = 2, string = "xyz"

$va: is_ref = 1, refcount = 2, string "xyz"

$vb: is_ref = 1, refcount = 2, string "xyz"

情景四:

$a = "qwe"; // $a 独居, is_ref = 0, refcount = 1;

$b = $a; // $a 与 $b 同居, is_ref = 0, refcount = 2;

$va = "xyz"; // $va 独居, is_ref = 0, refcount = 1;

$vb = &$va; // $va 和 $vb 结婚, is_ref = 1, refcount = 2;

$a = $va; // $a 想与 $va同居(而非结婚),但是$va已婚的,因此 $a只能从$b那里搬出来,重新分配个房子,值与$va一样(术语叫:变量分离);$va和$vb关系不变

赋值后:

$a: is_ref = 0, refcount = 1, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 1, refcount = 2, string "xyz"

$vb: is_ref = 1, refcount = 2, string "xyz"

情景五:

$a = "qwe"; // $a 独居, is_ref = 0, refcount = 1;

$b = $a; // $a 与 $b 同居, is_ref = 0, refcount = 2;

$va = "xyz"; // $va 独居, is_ref = 0, refcount = 1;

$vb = $va; // $va 和 $vb 同居, is_ref = 0, refcount = 2;

$a = &$va; // $a 想与 $va结婚,现在$a 和 $va 都是单身但是都有室友了,因此他们各自从原来的地方搬出来,然后分个新房子,值与$va原来的一样

赋值后:

$a: is_ref = 1, refcount = 2, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 1, refcount = 2, string "xyz"

$vb: is_ref = 0, refcount = 1, string "xyz"

情景六:

$a = "qwe"; // $a 独居, is_ref = 0, refcount = 1;

$b = $a; // $a 与 $b 同居, is_ref = 0, refcount = 2;

$va = "xyz"; // $va 独居, is_ref = 0, refcount = 1;

$vb = &$va; // $va 和 $vb 结婚, is_ref = 1, refcount = 2;

$a = &$va; // $a 想与 $va 结婚,但是 $va 是已婚的,而 $a 是单身,因此 $a 搬过去和 $va 住,$va 现在有两个配偶:$vb 和 $a

赋值后:

$a: is_ref = 1, refcount = 3, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 1, refcount = 3, string "xyz"

$vb: is_ref = 1, refcount = 3, string "xyz"

情景七:

$a = "qwe"; // $a 独居, is_ref = 0, refcount = 1;

$b = &$a; // $a 与 $b 结婚, is_ref = 1, refcount = 2;

$va = "xyz"; // $va 独居, is_ref = 0, refcount = 1;

$vb = $va; // $va 和 $vb 同居, is_ref = 0, refcount = 2;

$a = &$va; // $a 想与 $va 结婚,但是 $a 是已婚的,$va 是单身, 解决办法是 $a 离婚后和 $va 结婚,同时 $va 从与 $vb合租的地方搬出来

赋值后:

$a: is_ref = 1, refcount = 2, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 1, refcount = 2, string "xyz"

$vb: is_ref = 0, refcount = 1, string "xyz"

情景八:

$a = "qwe"; // $a 独居, is_ref = 0, refcount = 1;

$b = &$a; // $a 与 $b 结婚, is_ref = 1, refcount = 2;

$va = "xyz"; // $va 独居, is_ref = 0, refcount = 1;

$vb = &$va; // $va 和 $vb 结婚, is_ref = 1, refcount = 2;

$a = &$va; // $a 想与 $va 结婚,但是 $a和$va都是已婚的,谁离婚?$a!,因为是$a主动想和$va结婚,

// $a 离婚后$va住一起,$va 现在有两个配偶:$vb 和 $a

赋值后:

$a: is_ref = 1, refcount = 3, string = "xyz"

$b: is_ref = 0, refcount = 1, string = "qwe"

$va: is_ref = 1, refcount = 3, string "xyz"

$vb: is_ref = 1, refcount = 3, string "xyz"

以上分析了简单变量赋值的各种情形,不包括自引用的情况。概况来讲:

简单赋值 就是同居,需考察等号左侧变量的is_ref(即是否已婚),若 is_ref = 1,则值拷贝,否则考虑左侧便令,能否在不另外分配内存的情形下,与右侧变量共用同一存储空间(同居),此时要考察右侧是否是已婚,若是,则不能同居,变量分离,若右侧变量也是单身,则直接共用同一内存,所有同居者都遵循 COW(写时拷贝)的原则。

引用赋值 就是结合, 需先考察右侧变量的引用情况, 若 is_ref = 1,则直接 refcount ++, 出现多人结合的情况, 若右侧是非引用的(is_ref = 0),那还需考察右侧是否是独居,若是独居,则 左右两个变量共用右侧变量空间,否则右侧变量从原来的地方分离出来和左侧开辟新空间。 只要是引用赋值,那么左侧变量总是要与之前结合的或共用的变量进行分离。

http://www.bkjia.com/PHPjc/875473.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/875473.htmlTechArticlePHP 引用计数器 通俗版解释 概述 最近看PHP中的引用计数器部分,首先被各种绕晕,然后通过看博客和分析后,总结了一个比较通俗的解释,...

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

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

相关文章

windows c语言 http https检测_C语言编程工具的选择

1.先说说我的故事我是2007年上的大学,一所双一流工科大学。专业是计算机科学与技术。我们计算机专业没有C语言这门课。其他工科专业会学C语言这门课。据我所知,其他的工科专业需要过C语言2级考试。计算机专业不用考2级、3级...这些考试。我们计算机专业学…

php 按照laravel5.5,Laravel5.5 综合使用

使用 Laravel5.5 开发一个自动交割的项目,把使用到的开源扩展包及特性整理起来,以供后续使用。一、安装IDE提示工具Laravel IDE Helper 是一个极其好用的代码提示及补全工具,可以给编写代码带来极大的便利。1、安装# 如果只想在开发环境安装请…

usb声卡驱动_iCON ProDrive第三代USB声卡驱动全新发布!

2019年3月,iCON官方发布了一款全球首创——全新一代“ProDrive III”USB声卡驱动,iCON所有系列USB声卡(包括带声卡的MIDI键盘)已全面启用ProDrive III !iCON ProDrive III由iCON的国际工程师团队微调的高品质模拟元件和电路,可同时…

分数小数互换图_重复控制器学习心得(二)——超前环节的分数化和校正因子的引入...

本文仅作为学习记录,欢迎各位提出宝贵建议1、超前补偿环节的分数化在上周我学习了分数阶RC的实现方式,无独有偶,超前补偿环节也可以应用插值的方式来近似分数阶补偿。整数阶超前补偿的弊端主要有二:一、当采样频率和固定频率的比值…

java中execquery(),javaee登录界面

首先在此之前我们应该正确安装数据库,以及eclipse(javaee)文件包。1.首先在javaee中建立新的项目2.右键点击WebContent-New-JSP File,新建jsp(动态)文件。(想在哪个文件夹里添加jsp文件,就直接右击文件夹新建,注意一定不要展开文件…

电子工程专业评副高总结_微电子科学与工程专业怎么样?

专业简介080704 微电子科学与工程培养目标:本专业培养德、智、体等方面全面发展,具备微电子科学与工程专业扎实的自然科学基础、系统的专业知识和较强的实验技能与工程实践能力,能在微电子科学技术领域从事研究、开发、制造和管理等方面工…

vue if判断_vue循环判断

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>条件与循环</title><script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><h1>判断示例<…

显示器驱动有什么用_科普一下:电脑显示器用什么接口好,主流接口有哪些?...

如今是新的“视”界&#xff0c;生活中总与各种屏幕打交道&#xff0c;难免会遇到选择视频接线的问题&#xff0c;要想搞清楚这点&#xff0c;我们只要通过了解现今常用的几种视频接线就会有个大致的认识。经常会有一些朋友困扰&#xff0c;电脑显示器用什么接口最好&#xff0…

更改应用程序图标_在 Windows 10 version 1903 中查看应用程序是否支持 DPI 感知

在显示屏幕上&#xff0c;每英寸点数(DPI)定义构成面板的每个物理单元的像素数。传统上&#xff0c;显示器每英寸输出 96 个像素。但随着技术的发展&#xff0c;各大公司的产品已经开始增加同一物理空间中的像素数&#xff0c;也就造成了屏幕的 DPI 达到 200 甚至更高&#xff…

tina中信号带宽_关于通频带,3dB带宽,三阶截点和1dB压缩点,截止频率,频率范围,带宽,特征频率(中心频率),截止频率和增益(db)...

1、通频带通频带用于衡量放大电路对不同频率信号的放大能力。由于放大电路中电容、电感及半导体器件结电容等电抗元件的存在&#xff0c;在输入信号频率较低或较高时&#xff0c;放大倍数的数值会下降并产生相移。通常情况下&#xff0c;放大电路只适用于放大某一个特定频率范围…

php+控制器+数据库,Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法_PHP...

本文实例讲述了Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;前言&#xff1a;laravel创建数据库&#xff0c;实际可以手动创建&#xff0c;如古老的phpmyadmin 等均可以。一、数据库连接&#xff1a…

64位百度云 catia v6_福利缩水:百度网盘决定收回部分储存空间

近日&#xff0c;百度网盘公众号对外发布公告称&#xff0c;希望通过合理的资源调配&#xff0c;提升闲置空间使用率&#xff0c;让更多有切实需求的用户享受到优质、稳定、安全的个人云存储服务。因此&#xff0c;对百度网盘的存储空间方案做出调整。具体来看&#xff0c;2018…

物流配送系统设计java,ZigBee物流配送系统设计

目前生产系统的物流配送大部分仍处于较落后的状态&#xff0c;使用单位有物料需求时通过电话或邮件与配送单位进行沟通&#xff0c;这种方式存在沟通不及时和缺少数据记录的缺陷。在出现缺料问题时造成无法追究问题的责任单位&#xff0c;容易出现推脱等问题&#xff0c;对管理…

互联网产品生命周期_我市扎实推进全生命周期公共法律服务产品研发

近日&#xff0c;江苏省司法厅公布全省企业全生命周期公共法律服务产品研发评选活动结果&#xff0c;我市司法局、公证处报送的“区块链公证赋强平台”产品&#xff0c;以总分第一的好成绩荣获全省一等奖。近年来&#xff0c;市司法局充分发挥司法行政职能作用&#xff0c;持续…

stripfxg php,zzcms v8.2 中的众多cve分析

看了一下最近的cve列表&#xff0c;发现有大佬怒刷了好多个cve&#xff0c;这个zzcms都快被审穿了&#xff0c;所以跟进学习一下CMS背景本文跟踪的这个cms&#xff0c;属于一个开源招商网站管理系统&#xff0c;属于比较小的cms&#xff0c;所以很多地方写的不是很完善&#xf…

拉普拉斯变换_拉普拉斯变换——奇妙的数学

无奈学不会工程数学中的拉普拉斯变换&#xff0c;没办法去感知他的存在形式&#xff0c;在YOUTOBE上看到一个讲解拉普拉斯变换的视频&#xff0c;好像懂了些&#xff0c;分享给同样迷茫的小伙伴&#xff0c;下载的时候是有字幕的&#xff0c;发到知乎上就没字幕了&#xff0c;英…

没有足够的值_元丰通宝值多少钱吗?市场价值如何?有没有足够的收藏空间?...

元丰通宝是宋代神宗年间发行的&#xff0c;那么你知道现在元丰通宝值多少钱吗&#xff1f;市场价值如何&#xff1f;有没有足够的收藏空间&#xff1f;宋代虽然没有强大的军事实力&#xff0c;但其国内经济水平得到了发展&#xff0c;在许多朝代都处于领先地位。在元丰通宝的铸…

jsp中java代码无效_来杯咖啡,教你如何优雅的在java中统计代码块耗时

推荐阅读&#xff1a;Sping源码RedisNginxMySQL等七篇实战技术文档&#xff0c;阿里大佬推荐阿里内部&#xff1a;2020年全技术栈文档PPT分享&#xff0c;(万粉总结&#xff0c;回馈粉丝)在我们的实际开发中&#xff0c;多多少少会遇到统计一段代码片段的耗时的情况&#xff0c…

linux 随机抽取文件,shell 随机从文件中抽取若干行的实现方法

shuf -n5 main.txtsort -R main.txt | head -5awk -vN5 -vC"wc -l file" BEGIN{srand();while(nwhile read line;do echo "$line $RANDOM";done < main.txt | sort -k2,2n| awk NR<5{print $1}shuf 命令的选项&#xff1a;-e, --echo &#xff1a;将…

http header 设置编码_【译】http.client

本模块实现了HTTP和HTTPS协议的客户端功能。通常本模块不会被直接使用&#xff0c;而是被urllib.request调用&#xff0c;来处理HTTP和HTTPS相关的URL。备注&#xff1a;HTTPS只有在支持SSL(带有ssl模块)的Python编译器里面才是可用的。(一)模块提供的类class http.client.HTTP…