[基础篇]PHP引用变量
概述
该文章主要从内存空间上简述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引用变量相关推荐
- TensorFlow2.4 开发 基础篇① 张量和变量 (1)
TensorFlow2.4 开发 基础篇① 张量和变量(Tensor) 文章会不断更新,喜欢的小伙伴可以帮博主点个赞哟("'▽'") 文章目录 前言 1. 变量 1.1 ...
- 菜鸟学习笔记:Java基础篇2(变量、运算符、流程控制语句、方法)
菜鸟学习笔记:Java基础篇2 变量 基本概念 变量作用域 final关键字 运算符 算术运算符 比较运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 运算符优先级 Java三种流程控制语句 顺序 ...
- Java基础篇 - 强引用、弱引用、软引用和虚引用
前言 Java执行GC判断对象是否存活有两种方式其中一种是引用计数. 引用计数:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1. 在JDK 1.2以前的版本 ...
- Activiti7工作流引擎:基础篇(七) 流程变量
不要指望别人能帮你多少,人生事事物物都得靠自己. 一:简介 流程变量就是if(条件)中使用到的变量用于参与条件表达式的计算. 变量都是有作用域的,在程序中方法内部的变量是属于局部变量,方法外的变量属于 ...
- 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)
菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...
- cytoscape.js基础篇
cytoscape.js基础篇 cytoscape.js 包引用 版本信息 Citation Funding 基础篇 cytoscape.js变量描述 位置 Elements JSON 节点属性说明 ...
- java基础篇_java基础篇1
JAVA基础篇1 注释 单行注释 //这是一个单行注释,由两个斜杠组成,不能嵌套多行注释 多行注释 /*这是一个 多行注释 ,//里面不能嵌套多行注释, 但是可以嵌套单行注释*/ 文档注释 /**ja ...
- 视频教程-C# For Unity系列之基础篇-Unity3D
C# For Unity系列之基础篇 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过程.软件架构设计理 ...
- ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...
JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...
- 字符变量赋值规则_Java的常量、变量、数据类型(基础篇二)
标识符 标识符:是指在程序中自己定义的内容,如类名.方法名.变量名等等. 命名规则:是有硬性要求的 关键字:是指Java已经定义好的单词,具有特殊含义,比如public.static.class.vo ...
最新文章
- apache源码安装
- mysql怎么实现事务序列化_MySQL 架构 - 事务处理
- 机器学习实战读书笔记(2)决策树
- 示波器1m和50欧姆示阻抗匹配_为什么示波器阻抗偏偏是1M和50欧?-测试测量-与非网...
- nodeJs 是什么?你需要先想清楚这个问题,才能学习nodejs (介绍)
- pads中如何设置等长_期货如何设置止损止盈避免交易中被套-期货学习
- pyinstaller 打包python应用为exe后 打包出现failed to execute script
- 等午饭吃过后的dwzjzx
- zemax验证高斯公式_ZEMAX 实验讲义
- 用python写helloworld_Python基于Tkinter的HelloWorld入门实例
- 线程与并发基础-青铜
- 【系统架构设计师】软考高级职称,一次通过,倾尽所有,2016年下半年系统架构设计师考试论文真题(论述软件设计模式技术及应用)
- Vivado常见问题集锦
- 各路技术牛人都推荐的书
- 居中 html css
- python网络安全宣传周_基于Python的IA分布式系统_吴芳
- HCI实验之问卷设计
- Code-NFine:jqgrid 数据绑定
- [iOS_Dev] 官方Mac OS X.dmg 下载,dmg 转 iso,Mac 镜像。
- VMware ESXi 7.0 U2 SLIC Unlocker USB 网卡驱动集成镜像