PHP的引用(&)详解

2018-08-03 11:17:00
linefo
原创
413

前言


PHP中所指的引用,是让不同的名称能使用到同一个内容(内存中)。


基本描述:变量的引用


(例1)声明一个变量$a,并将其值赋予变量$b:


<?php
	$a = 1;
	$b = $a;


经过上面的操作,$a和$b的值都是1了。如果我们接着把$b的值另外赋值2,对$a的值是没有影响的。因为在 $b = $a 执行时,是一个“拷贝”,即$a和$b都分别在内存中有独立的内容记录它们的值。


(例2)声明一个变量$a,并引用传递到$b:


<?php
	$a = 1;
	$b = &$a;


上面如果我们接着把$b的值改为2,那么输出$a的值也会是2。这是因为 $b = &$a 执行时,其实是告诉$b,你和$a指向的是内存的同一个位置,$a和$b仅仅是同一个内存值的不同名称。


扩展描述:存在引用情况时,unset()的使用


我们知道unset()是用来销毁变量的,那么在例2中,如果接着我们使用unset($a),那么是否输出$b也会没有值了呢?

答案是否定的。

实际情况是:我们unset($a),输出$b值为1;而unset($b),输出$a值为1。

为什么会这样呢?

因为在PHP里面,内存中的一个内容的真正销毁,是要看有没有名称指向它。而unset()在这里更准确的说应该是销毁“变量名称”,所以必须$a和$b两个变量名称都被销毁了,其所指向的内存内容才会被释放。


更复杂的应用:函数的返回引用


(例3)一个函数的返回引用例子:


<?php
	function &test(){
		static $txt = 'aa';
		return $txt;
	}
	$a = &test(); // 此时如果输出$a,值为'aa'
	$a = "11";
	
	$b = test();
	echo $b; // 输出值为11


例3看起来有点难受。


上面,输出$b的值为11,说明test()函数的返回值已经和$a指向了内存中同一个内容。

要实现上面的效果,首先声明函数要加上&;同时调用时也要加上&。

如果调用时不加上&,则和普通的函数调用没有区别,最后输出$b的值为'aa';

文章分类
联系我们
联系人: Mr.Chen
QQ: 185391277