php的变量引用与销毁机制

news/2024/11/29 0:38:55/

在php中,符号"&"表示引用。

1、看看不引用的情况是这样子:

$a  = "hello world";//定义一个变量,下面赋值给$b
$b = $a;//这一步没有在$a之前加符号&,像这样子"$b= & $a"。没有加&,实际上原理是会将变量$a复制拷贝一份,也就是内存中重新申请一个地址存储变量$b了

复制

ps:在php中,使用"="直接赋值,其实就是拷贝一份右边的变量给b,会生成一份内存空间,结果可能是同样的内容在内存中两份。在有些关于php性能方面提到,这样子会多占有内存空间。不过我接触中,大部分人没怎么注意,其实一般应用这样子用产生的显著差异并不明显。不会看到什么效果,其实我本人也没经常使用&进行引用,呵呵。只是我觉得,深入了解里面的实现原理,非常有必要。我喜欢关注原理性的东西。

2、使用符号&进行引用

$a  = "hello world";
$b = &  $a;

复制

使用引用,php引擎不会拷贝一份变量,其实就是将指针指向了$a在内存中的地址,$b中就是保存了这个指针。

所以使用引用的时候,把$b的值改变,$a也会跟着改变

比如:

$a  = "hello world";
$b = &  $a;
$b = "test new value";//把b的值改掉,a的值也会跟着改变
echo $a;//输出test new value,因为改变了b的值也会改变a的值。

复制

=====================================

经常在定义函数的时候看到像这样的情况:

function test (& $param)
{
//函数定义的内容
$param++;
}

复制

解释:$param前面带有引用,所以传入进来的参数并不会在内存中拷贝一份,而是直接对原来的内存空间进行引用。所以:如果里对使用符号&传入进来的变量值进行修改了,那么也会改变原来的内存空间中的值。

做个测验如下:

$k = 8;
test($k);
echo $k;//结果$k的值被函数里面改变了,输出9。

复制

还会经常看到这样子调用函数:

$return  = & test_func();

复制

前面了解到php引擎的机制是:=会把右边的内容拷贝一份给予左边的变量。所以使用&就是将函数的结果不会进行拷贝一份,实际上我的理解是把指针给了左边的变量。

什么是指针,以前学c语言中的概念。我的理解是就是:指针,指针,指向针(指南针,呵呵)。把指针看成是一个内存的地址容易理解点,计算机就知道去内存什么位置找数据了吧。这是浅显的理解,深入的我不会,呵呵。

总结:使用引用是为了减少内存资源的占用。

php手册中对引用的解释如下:

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。

3、销毁变量的时候。并不会改变原来的值。

试验:$b = & $a;

既然改变$b的值,$a的值也跟着改变,假如把$b销毁掉(内存中不占用空间了,不是null,也不是值为""),$a的值是不是也会跟着被删掉呢?

其实国外有本php方面的书中专门提到了这个机制。2年前看的。不是很记得了。原则是就是删除变量的时候,会自动拷贝。

其实这样子,就是为了避免把$b给删掉,造成把$a也给删掉的问题。

//只有等到销毁的时候就会自动拷贝一份。php不会把被引用的变量销毁掉。
$a = 'd';
$b = & $a;
$b = 8;//因为是引用了,所以把b的值改掉,a的值也跟着改为8了。
var_dump($b,$a);
unset($b);//调用unset删除b变量,a变量不会删除
var_dump($b,$a);//输出null和8

复制

调用unset删除$b变量的时候,php引擎从变量符号表中发现:我要删除的变量$b原来是引用了变量$a,这不好删除啊,因为一删除导致$a变量也没了,所以就先把$a变量拷贝一份后在删除$b变量。

关于php符号表:其实我的理解是,运行中所有变量名称都记录在里面,php来维护,具体的数据当然是存储在内存中,php就是根据这个符号表去回收没有用到的变量空间的,释放内存空间)。去看看php的垃圾回收机制(释放不再使用的内存空间),就是根据符号表进行的。


http://www.ppmy.cn/news/516536.html

相关文章

好消息好消息——带计算机课程的希捷移动硬盘发货啦

咱们今天,开门建山。我要发什么货? 当当当当,就是下面啦: 带有 800 G 学习资料的移动硬盘啦,如图。 当年为了学习计算机,也是在网络上,东拼西凑,好不容易找到了不少的学习资源。可惜…

我的希捷ST31000340NS,BIOS不认,磁头反复归位,BUSY模式的固件门硬盘修复成功

当初我买了2块希捷1T的硬盘,为了安全起见还特地加钱买了企业级的,没想到为日后埋下了悲剧。 首先这2块硬盘正好是固件门里面的问题盘,我相信了希捷官方的“不是所有人都会出问题,没出问题就不用升级固件”口号,一直没有…

希捷硬盘1T挂了(1)

一块160G的ST用了5年,是做系统盘用的。 这款1T的ST2013年1月买的,现在挂了。 前两天,同事反映打开文件很慢,有时还找不到硬盘。 今天打开系统,用hdtune测试,发现里面有很多坏扇区,大概有2K多个。…

希捷 sshd 微型计算机,希捷1TB SSHD拆解/核心技术分析_硬盘_内存硬盘-中关村在线...

■3.5英寸希捷1TB SSHD拆解分析 盘体和SSD模块是固态混合硬盘的两大组成部分。它的盘体采用普通机械硬盘,它的区别在于集成SSD模块的PCB基板。因此它的PCB基板面积显得电子元件更为密集。 主要构成:盘体PCB板(SSD模块) 固态混合硬盘的SSD模块作为记忆缓存…

希捷1TB硬盘正式发布

随着全球范围内数字内容的迅猛增长,希捷科技公司(NYSE:STX)日前宣布为各种企业和台式电脑应用提供行业领先的集容量、性能、可靠性为一体的1TB硬盘。 数字内容在家庭和办公室的爆炸性增长带动了市场对大容量硬盘的迫切需求。企业和消费者不断制造和消费着惊人的数字…

二分查找算法及实现

概念 二分查找算法也成为折半查找,是一种非常高效的工作于有序数组的查找算法. 实现 需求 现有一个有序数组 arr [1,2,3,4,5,6,7,8,9], 目标值target 2 ,要求返回目标值target在数组arr中的索引,没有则返回-1; 代码实现 private int binarySearch(int[] arr, int target)…

达人评测 r7 7730U和R5 7530U选哪个好 锐龙r77730U和R57530U对比

AMD锐龙7 7730U采用Barcelo8核心/16线程主频 2.0GHz最高频率 4.5GHz 三级缓存运行内存 16M内存类型 LPDDR4X内存频率 4266MHz 笔记本cpu选r7 7730U还是R5 7530U这些点很重要 http://www.adiannao.cn/dy R5 7530U 采用Zen3 架构为 6 核 12 线程,3MB 二级缓存&#x…

入手评测 r7 6800h和 r7 5800h差别大不大

R7 6800H 采用6纳米工艺 8 核 16 线程,主频 3.2GHz-4.7GHz,一级缓存 512KB二级缓存 4MB 三级缓存 16MB热设计功耗(TDP) 45W 内存参数,搭载了 DDR5 选R7 5800H还是r7 6800h这些点很重要!看完你就知道了http://www.adiannao.cn/dy R7 5800H 为…