PHP 的值传递与引用传递
PHP 中值传递与引用传递
前言
在内存中,通常有以下几个分区
- 栈区:程序可以操作的内存部分(不存数据,运行程序代码,),少,速度快。
- 代码段:存储程序的内存部分(不执行)。
- 数据段:存储普通数据(全局区 & 静态区)。
- 堆区:存储复杂数据,大(相对栈区)但效率低。
## 值传递
例如
php
<?php
$a = 1;
$b = $a;
$b = 2;
echo $a , $b;
?>
首先,代码被编译(翻译),装载到代码段(字节码)
代码执行,从代码段中一行一行执行代码
2.1. 执行 a=1,在栈区开辟一段内存存储 a,在数据段中开辟一块内存保存值 1,然后将 1 所在的内存地址赋值给变量a
2.2. 执行 b=a:栈区开辟存储 b,发现是赋值运算,同时取出 a 的值,重新在数据段存储一遍,将这个值的内存地址赋值给变量 b
脚本执行结束:系统回收所有内存(栈区,代码段),数据段因为没有变量指向,所以当成垃圾回收。
引用传递
例如
<?php
$a = 1;
$b = &$a;
$b = 2;
echo $a , $b;
?>
首先,代码被编译(翻译),装载到代码段(字节码)
代码执行,从代码段中一行一行执行代码
2.1. 执行 a=1,在栈区开辟一段内存存储 a,在数据段中开辟一块内存保存值 1,然后将 1 所在的内存地址赋值给变量a
2.2. 执行 b=a:栈区开辟存储 b,发现是赋值运算,且,是引用传值,会取出 a 保存的内存地址,将这个值的内存地址赋值给变量 b,也就是说变量 a ,b 同时对应数据段的同一个内存地址 ,可以认为成变量 b 是变量 a 的别名
脚本执行结束:系统回收所有内存(栈区,代码段),数据段内容因为没有变量指向,所以当成垃圾回收。
指针与引用的区别
引用
引用相当于一个已有变量(对象)的别名,一旦绑定,不能再与其他变量(对象)绑定,销毁时,只是取消绑定关系。如果原来的变量(对象)没有销毁,则那块内容不会被回收。如果一起被销毁,则都被回收。
指针
指针可以指向多个变量(对象),引用在初始化的时候已经绑定了变量(对象),且引用必须初始化。指针可以为空,引用不可以。
小结
引用就相当于一个受限制的指针,相对来说可能更加繁琐,受限制更多。
推荐师傅
这是一个喜欢钻研二进制的师傅,如果有什么好玩的东西,可以在他的博客的评论区找到他,地址如下,走你。