引用变量(&)

参考:
PHP引用的官方解释

摘要:
引用变量概念:不同的名字访问同一个变量内容
引用变量的定义方式:使用&符号
引用变量的优点:大数组使用引用能够节省大量的内存;引用可以写出简洁的代码;

一、引用变量基础知识

Demo1 使用memory_get_usage函数了解引用

//定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage());//该函数查看内存的使用情况

//定义变量b,将a变量的值赋值给b
//引用变量不存在 COW原则(Copy On Write,该原则是:一个变量赋值给一个参数,这个参数赋值给另一个参数,只有第二个参数发生改变时才会在内存当中重新生成一块内存)
$b = &$a;
var_dump(memory_get_usage());

//对 a进行修改
$a = range(0, 1000);
var_dump(memory_get_usage());

//结果:内存的使用两都是差不多的,说明并没有使用新的空间来存储

图形解释:
在这里插入图片描述

Demo2 使用xdebug_debug_zval函数了解引用

// zval变量容器
$a = range(0, 3);
xdebug_debug_zval('a');//查看变量在内存当中的引用信息(该函数有两个参数:refcount变量引用的数量、is_ref是否被引用;该函数的使用需要安装xdebug扩展,Linux需要yum进行安装)

$b = &$a;
xdebug_debug_zval('a');

$a = range(0, 3);
xdebug_debug_zval('a');

打印的结果:
在这里插入图片描述

Demo3 引用变量的销毁

// unset 只会取消引用,不会销毁引用
$a = 1;

$b = &$a;

unset($b);

echo $a. "\n";

图形解释:
在这里插入图片描述

二、对象与引用的关系

对象本身就是引用传值,所以就不用使用&
Demo4 对象与引用变量

// 对象本身就是引用传递
class Person
{
	public $name = "zhangsan";
}

$p1 = new Person;
xdebug_debug_zval('p1');

$p2 = $p1;
xdebug_debug_zval('p1');

$p2->name = "lisi";
xdebug_debug_zval('p1');

在这里插入图片描述

三、引用变量的经典题

ps:这道题一定是你似曾相识的问题

// 写出如下程序的输出结果
$data = ['a', 'b', 'c'];
foreach ($data as $key => $value) {
	$val = &$data[$key];
}
//程序运行时,每一次循环结束后变量$data的值是什么?请解释
//程序执行完成后,变量$data的值是什么?请解释

注:引用变量在引用地址发生改变时,原来的变量会保持原来的引用的值,相对而言只是失去了引用;

猜你喜欢

转载自blog.csdn.net/weixin_40022980/article/details/83057670
今日推荐