概述

该文章主要从内存空间上简述PHP中引用变量的基本概念、工作方式,以及一个常见的demo实例。

概念

  • 什么是引用变量,在PHP当中,用什么符号定义引用变量?

    • 不同的名字访问同一个变量内容,使用&表示。
  • COW(copy on write)

    • 内存优化的常见手段,在php中也采用了这种方式来优化内存。
    • 写时复制,即只有当对其中一个或多个变量进行写操作的时候,才会复制一份内存,对其内容进行修改。

      在PHP中使用memory_get_usage()观察内存变化

演示

未使用&(引用变量)

        $a = range(0,1000);var_dump(memory_get_usage());$b = $a;`var_dump(memory_get_usage());$a = range(0,1000);var_dump(memory_get_usage());

运行结果:

内存在第一次和第二次并没有太大的差异,第三次产生较大差异

使用 &

        $a = range(0,1000);var_dump(memory_get_usage());$b = &$a;var_dump(memory_get_usage());$a = range(0,1000);var_dump(memory_get_usage());

运行结果:

在使用引用传值内存解析分析:

$a被赋值时在内存中占据A内存空间,$b=&$a$b指向同一内存空间,当$a发生改变时$b所占据的内存空间会跟随$a变化

unset

unset() 只会取消引用不会销毁空间

$a=1;
$b=&$a;
unset($b);
echo $a;

输出结果:1

内存空间分析:

$a被赋值 $b=&$a之后$a与$b直行同一内存空间,当unset($b)时取消了$b$a的引用,使$b不在指向$a的内存空间

题外话

对象本身就是引用传递

class Person
{public $name="zhangsan";
}
$p1 =new Person;
xdebug_debug_zval('p1');
$p2 =$p1;
xdebug_debug_zval('p1');
$p2->name="lisi";
xdebug_debug_zval('p1');

运行结果:

结果分析:

对象被实例后经引用传递之后$p1 $p2指向的始终是同一内存空间

案例

     <?php$data = ['a', 'b', 'c'];foreach($data as $key => $val){$val = &$data[$key];}var_dump($data);

写出如上程序的输出结果?
程序运行时,每一次循环结束后变量$data的值是什么?
程序执行完成后,变量$data的值是什么?

内存变化及解析:

感谢

感谢你看到这里,希望本篇可以帮到你。有问题可在评论区留言,谢谢

[基础篇]PHP引用变量相关推荐

  1. TensorFlow2.4 开发 基础篇① 张量和变量 (1)

         TensorFlow2.4 开发 基础篇① 张量和变量(Tensor) 文章会不断更新,喜欢的小伙伴可以帮博主点个赞哟("'▽'") 文章目录 前言 1. 变量 1.1 ...

  2. 菜鸟学习笔记:Java基础篇2(变量、运算符、流程控制语句、方法)

    菜鸟学习笔记:Java基础篇2 变量 基本概念 变量作用域 final关键字 运算符 算术运算符 比较运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 运算符优先级 Java三种流程控制语句 顺序 ...

  3. Java基础篇 - 强引用、弱引用、软引用和虚引用

    前言 Java执行GC判断对象是否存活有两种方式其中一种是引用计数. 引用计数:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1. 在JDK 1.2以前的版本 ...

  4. Activiti7工作流引擎:基础篇(七) 流程变量

    不要指望别人能帮你多少,人生事事物物都得靠自己. 一:简介 流程变量就是if(条件)中使用到的变量用于参与条件表达式的计算. 变量都是有作用域的,在程序中方法内部的变量是属于局部变量,方法外的变量属于 ...

  5. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

    菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...

  6. cytoscape.js基础篇

    cytoscape.js基础篇 cytoscape.js 包引用 版本信息 Citation Funding 基础篇 cytoscape.js变量描述 位置 Elements JSON 节点属性说明 ...

  7. java基础篇_java基础篇1

    JAVA基础篇1 注释 单行注释 //这是一个单行注释,由两个斜杠组成,不能嵌套多行注释 多行注释 /*这是一个 多行注释 ,//里面不能嵌套多行注释, 但是可以嵌套单行注释*/ 文档注释 /**ja ...

  8. 视频教程-C# For Unity系列之基础篇-Unity3D

    C# For Unity系列之基础篇 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过程.软件架构设计理 ...

  9. ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...

    JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...

  10. 字符变量赋值规则_Java的常量、变量、数据类型(基础篇二)

    标识符 标识符:是指在程序中自己定义的内容,如类名.方法名.变量名等等. 命名规则:是有硬性要求的 关键字:是指Java已经定义好的单词,具有特殊含义,比如public.static.class.vo ...

最新文章

  1. apache源码安装
  2. mysql怎么实现事务序列化_MySQL 架构 - 事务处理
  3. 机器学习实战读书笔记(2)决策树
  4. 示波器1m和50欧姆示阻抗匹配_为什么示波器阻抗偏偏是1M和50欧?-测试测量-与非网...
  5. nodeJs 是什么?你需要先想清楚这个问题,才能学习nodejs (介绍)
  6. pads中如何设置等长_期货如何设置止损止盈避免交易中被套-期货学习
  7. pyinstaller 打包python应用为exe后 打包出现failed to execute script
  8. 等午饭吃过后的dwzjzx
  9. zemax验证高斯公式_ZEMAX 实验讲义
  10. 用python写helloworld_Python基于Tkinter的HelloWorld入门实例
  11. 线程与并发基础-青铜
  12. 【系统架构设计师】软考高级职称,一次通过,倾尽所有,2016年下半年系统架构设计师考试论文真题(论述软件设计模式技术及应用)
  13. Vivado常见问题集锦
  14. 各路技术牛人都推荐的书
  15. 居中 html css
  16. python网络安全宣传周_基于Python的IA分布式系统_吴芳
  17. HCI实验之问卷设计
  18. Code-NFine:jqgrid 数据绑定
  19. [iOS_Dev] 官方Mac OS X.dmg 下载,dmg 转 iso,Mac 镜像。
  20. VMware ESXi 7.0 U2 SLIC Unlocker USB 网卡驱动集成镜像

热门文章

  1. iOS开发之--NSPredicate
  2. 使用w3m访问页面执行函数
  3. linux下多线程断点下载工具-axel
  4. Debian下配置iSCSI Target。
  5. ARMv8-A architecture overview
  6. 关于systemtap的一些examples
  7. 要搞懂 volatile 关键字,就靠这 26 张图
  8. DPDK收发包全景分析
  9. virt_to_page
  10. ffmpeg文档5:同步视频