首先我们来做一道题:
- $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" 的值是时,"is_ref" 的值总是
.
- FALSE
来源: http://www.bubuko.com/infodetail-1946829.html