前言

在内存中,通常有以下几个分区

  • 栈区:程序可以操作的内存部分(不存数据,运行程序代码,),少,速度快。
  • 代码段:存储程序的内存部分(不执行)。
  • 数据段:存储普通数据(全局区 & 静态区)。
  • 堆区:存储复杂数据,大(相对栈区)但效率低。

值传递

例如

<?php
 $a = 1;
 $b = $a;
 $b = 2;
 echo $a , $b;
?>
  1. 首先,代码被编译(翻译),装载到代码段(字节码)
  2. 代码执行,从代码段中一行一行执行代码
    2.1. 执行 a=1,在栈区开辟一段内存存储 a,在数据段中开辟一块内存保存值 1,然后将 1 所在的内存地址赋值给变量a
    2.2. 执行 b=a:栈区开辟存储 b,发现是赋值运算,同时取出 a 的值,重新在数据段存储一遍,将这个值的内存地址赋值给变量 b
  3. 脚本执行结束:系统回收所有内存(栈区,代码段),数据段因为没有变量指向,所以当成垃圾回收。

引用传递

例如

<?php
 $a = 1;
 $b = &$a;
 $b = 2;
 echo $a , $b;
?>
  1. 首先,代码被编译(翻译),装载到代码段(字节码)
  2. 代码执行,从代码段中一行一行执行代码
    2.1. 执行 a=1,在栈区开辟一段内存存储 a,在数据段中开辟一块内存保存值 1,然后将 1 所在的内存地址赋值给变量a
    2.2. 执行 b=a:栈区开辟存储 b,发现是赋值运算,且,是引用传值,会取出 a 保存的内存地址,将这个值的内存地址赋值给变量 b,也就是说变量 a ,b 同时对应数据段的同一个内存地址 ,可以认为成变量 b 是变量 a 的别名
  3. 脚本执行结束:系统回收所有内存(栈区,代码段),数据段内容因为没有变量指向,所以当成垃圾回收。

指针与引用的区别

引用

引用相当于一个已有变量(对象)的别名,一旦绑定,不能再与其他变量(对象)绑定,销毁时,只是取消绑定关系。如果原来的变量(对象)没有销毁,则那块内容不会被回收。如果一起被销毁,则都被回收。

指针

指针可以指向多个变量(对象),引用在初始化的时候已经绑定了变量(对象),且引用必须初始化。指针可以为空,引用不可以。

小结

引用就相当于一个受限制的指针,相对来说可能更加繁琐,受限制更多。

PHP 的值传递与引用传递

https://blog.sdgou.cc/archives/107.html

作者

白鸽

发布时间

2022-02-18

许可协议

CC BY-SA 4.0