深入理解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.

 

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值