深入理解PHP中的引用和赋值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解PHP中的引用和赋值相关的知识,希望对你有一定的参考价值。
首先我们来做一道题:
$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
.
以上是关于深入理解PHP中的引用和赋值的主要内容,如果未能解决你的问题,请参考以下文章