该文章主要从内存空间上简述PHP中引用变量的基本概念、工做方式,以及一个常见的demo实例。php
什么是引用变量,在PHP当中,用什么符号定义引用变量?优化
COW(copy on write)spa
写时复制,即只有当对其中一个或多个变量进行写操做的时候,才会复制一分内存,对其内容进行修改。debug
在PHP中使用
memory_get_usage()
观察内存变化
未使用&(引用变量)3d
$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());
运行结果:code
内存在第一次和第二次并无太大的差别,第三次产生较大差别
使用 &对象
$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());
运行结果:blog
在使用引用传值内存解析分析:ip
$a
被赋值时在内存中占据A内存空间,$b=&$a
时$b
指向同一内存空间,当$a
发生改变时$b
所占据的内存空间会跟随$a
变化
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的值是什么?
内存变化及解析:
感谢你看到这里,但愿本篇能够帮到你。有问题可在评论区留言,谢谢