php传值与传引用的区别,关于引用变量的理解

发布时间:2020/07/29 作者:天马行空 阅读(879)

什么是传值?
在赋值的过程中如果传递的是一个非对象,就会重新开辟内存空间,相当于把原值复制一份,和原值是彼此独立的,对新赋值的这个变量做任何改动都不影响原值。

什么是引用?
在赋值的过程中如果传递的是一个引用或者对象,这种方式是传真实的内存地址,对其中任何一个变量做改动,会影响到所有建立引用关系的变量。

简单理解就是:php的引用变量,就是用不同的名字访问相同变量内容。

注意:
1、引用指向同一个内存空间的变量,当内存中的值发生改变后,所有的变量都将看到改变后的值;
2、unset的时候只会取消引用,不会销毁内存空间;
2、php的类对象本身就是引用传值,将一个实例化的对象赋值给另外一个变量的时候,不需要加&符号。如果需要进行空间复制可以使用clone来实现。
4、将一个变量赋值给另外一个变量的时候不会马上开辟一块内存空间,只有当其中一个变量发生修改的时候才会新开辟一块内存空间(COW机制:copy on write)

看看下面这个代码执行后的$data最终结果是什么?

$date = ['a','b','c'];
foreach($data as $k=>$v){
    $v = &$data[$k];
}


第一次循环:
1、$k=0;$v='a';
2、$v与$data[0]建立引用关系;
此时$data的结果是:['a','b','c']
第二次循环:
1、$k=1;$v='b';由于$v与上一次循环的$data[0]建立引用关系,无论两个变量哪一个发生变化都会导致另外一个变化,所以$data[0]也变成了b
2、$v与$data[1]建立引用关系;在与$data[1]建立引用关系的同时也解除了$v与$data[0]的引用关系;
此时$data的结果是:['b','b','c']
第三次循环:
1、$k=2;$v='c';由于$v与上一次循环的$data[1]建立引用关系,无论两个变量哪一个发生变化都会导致另外一个变化,所以$data[1]也变成了c
2、$v与$data[2]建立引用关系;在与$data[2]建立引用关系的同时也解除了$v与$data[1]的引用关系;
此时$data的结果是:['b','c','c']

关键字php 引用