理解php赋值原理

PHP变量结构

PHP变量都放在一个zval结构中,它包含变量的值和相关信息

struct _zval_struct {
    zvalue_value  value;     /* value 变量值 */
    zend_uint  refcount__gc;  /* variable ref count 记录了指向该变量的符号数量 */
    zend_uchar  type;          /* active type 变量类型 */
    zend_uchar  is_ref__gc;    /* if it is a ref variable 该变量是否为引用变量 */
};

创建一个变量的时候,PHP会为这个变量分配一个zval结构,填入相应的值,然后将这个变量的名字和指向这个zval的指针填入一个数组中。当你获取这个变量的时候,PHP会通过查找这个数组,获得对应的zval

PHP变量赋值

安装xdebug之后使用函数xdebug_debug_zval显示”refcount”和”is_ref”的值

$a = 10;
xdebug_debug_zval(‘a’);

结果显示:
这里写图片描述

$b= $a;
xdebug_debug_zval(‘a’);

结果显示:
这里写图片描述
refcount=2说它被两个变量同时使用

$a = 1;
xdebug_debug_zval(‘a’);

结果显示:
这里写图片描述

因此变量赋值后,在两个变量没有发生改变时,它们指向的是同一个zval结构。当其中一个变量发生改变的时候,才会分配新的内存空间

对变量调用了函数 unset()时,”refcount“就会减1

$a = 10;
$b = $a;
xdebug_debug_zval('a');
unset($b);
xdebug_debug_zval('a');

这里写图片描述
当refcount为0时,变量会被销毁

引用赋值

$a = 10;
xdebug_debug_zval('a');
$b = &$a;
xdebug_debug_zval('a');

这里写图片描述
引用赋值两个变量指向同一个内存空间

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值