php zval结构体

typedef struct zval_struct{
    zval_value value;
    zend_uint ref_count;
    zend_uchar type;
    zend_uchar is_ref;
}

其中是真正保存数据的部分,定位为一个联合体(union)

typedef union _zvalue_value {
    long lval;
    double dval;
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht;
    zend_object_value obj;
} zvalue_value;
写时复制
$a = 1;
$b = $a;
$b += 5;
  1. 复制一个和$b所指向zval一样的zavl;
  2. $b所指的zvalref_count减一;
  3. 初始化新的zval设置ref_count=1,is_ref=0;
  4. $b指向新的zval
写时改变
$a = 1;
$b = &$a;
$b += 5;
  1. 第一步和写时复制的第一步一样;
  2. 第二步$b所指向的zvalref_count+1,并将is_ref设置为1;
  3. $b变化时,会执行get_var_and_separate()函数看是否需要分离,如果is_ref会直接返回$b所指向的zval
  4. 再去修改$b的值,$a的值也会变,因为指向的都是同一个zval
写时分离
$a = 1;
$b = $a;
$c = &$a;

如果一个zval结构体既有ref_countis_ref
Zend会将等号右边的变量分离出来一个新的zval

global$_GOLBAL['a']
  • global是全局作用域a的引用

  • $_GOLBAL['a']是全局作用域a的本身

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值