博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解PHP中的引用和赋值
阅读量:4611 次
发布时间:2019-06-09

本文共 851 字,大约阅读时间需要 2 分钟。

首先我们来做一道题:

$test = 'aaaaaa';    $abc = & $test;    unset($test);    echo $abc;

我预想的结果是提示未定义,但是结果是'aaaaaa'。

 

之后我去百度了一下发现了一个很值得一看的文章:http://www.cnblogs.com/lonelyxmas/p/4205183.html

 

这里我就对我的题目做一个解释:

我的理解:最开始只有$test一个变量指向aaaaaa,在$abc引用之后就增加了下面的一条线,unset只是把上面的线切掉,并没有释放变量,所以最后结果输出aaaaa。

 

总结如下:

(1)将一个常量赋值给一个变量时,会为这个变量分配内存空间。

(2)PHP中将一个变量赋值给新变量时,不会立即为新变量分配内存空间,只是增加了对内存空间的引用。当原变量或者新变量作出任何改变时,才会为新变量 分配一块内存空间。

(3)&赋值的时候,视为一个变量定义了一个别名,增加了一个对内存空间的引用。改变其中一个,会影响其他的引用。而使用unset()时,只是断开了对变量内存空间的引用,内存空间不会释放。

 

下面装个B(因为现在的我看不懂):

  每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(referenceset)。通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。当"refcount"的值是1时,"is_ref"的值总是FALSE.

 

转载于:https://www.cnblogs.com/foryuhang/p/6405082.html

你可能感兴趣的文章
Hanoi塔问题——递归
查看>>
高斯 到 正态分布 的前世今生
查看>>
for 循环遍历字典中的键值两种方法
查看>>
计算客 商品推荐走马灯(简单)(求区间全部连续的回文串价值)
查看>>
IOS 'NSInternalInconsistencyException'
查看>>
vim安装ctags,taglist和Pydiction
查看>>
机器学习系列之EM算法
查看>>
Time.timeScale 对 协程WaitForSeconds的影响
查看>>
Java并发编程-CAS
查看>>
SQL Server 2008的备份和日志收缩
查看>>
sqlserver数据库数据字典生成器
查看>>
iOS经典面试题 (一)
查看>>
Linux : 从私钥中提取公钥
查看>>
Quartz.Net分布式任务管理平台
查看>>
58同城2018提前批前端笔试题总结
查看>>
compilation与编译
查看>>
useradd mfs -s /sbin/nologin -M
查看>>
mysql数据库:数据类型、存储引擎、约束、
查看>>
LeetCode-Find the Celebrity
查看>>
LeetCode-Longest Increasing Subsequence
查看>>