引用变量(&)

参考:
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=>$val){
    $val = &$data[$key];
    print_r($data);
}
//程序运行时,每一次循环结束后变量$data的值是什么?请解释
//程序执行完成后,变量$data的值是什么?请解释

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值