PHP 的值传递与引用传递

这篇文章上次修改于 1 年前,可能部分内容已经不适用,如有疑问可询问作者。

PHP 的值传递与引用传递

PHP 中值传递与引用传递

前言

在内存中,通常有以下几个分区 - 栈区:程序可以操作的内存部分(不存数据,运行程序代码,),少,速度快。 - 代码段:存储程序的内存部分(不执行)。 - 数据段:存储普通数据(全局区 & 静态区)。 - 堆区:存储复杂数据,大(相对栈区)但效率低。 ## 值传递 例如 php <?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
<?php
 $a = 1;
 $b = &$a;
 $b = 2;
 echo $a , $b;
?>
Copy
  1. 首先,代码被编译(翻译),装载到代码段(字节码)

  2. 代码执行,从代码段中一行一行执行代码

    2.1. 执行 a=1,在栈区开辟一段内存存储 a,在数据段中开辟一块内存保存值 1,然后将 1 所在的内存地址赋值给变量a

    2.2. 执行 b=a:栈区开辟存储 b,发现是赋值运算,且,是引用传值,会取出 a 保存的内存地址,将这个值的内存地址赋值给变量 b,也就是说变量 a ,b 同时对应数据段的同一个内存地址 ,可以认为成变量 b 是变量 a 的别名

  3. 脚本执行结束:系统回收所有内存(栈区,代码段),数据段内容因为没有变量指向,所以当成垃圾回收。

指针与引用的区别

引用

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

指针

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

小结

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

推荐师傅

这是一个喜欢钻研二进制的师傅,如果有什么好玩的东西,可以在他的博客的评论区找到他,地址如下,走你。