php7引用类型的实现

前言

在讲zend_reference之前,需要先了解下zval,如果还不了解zval是什么,可以先去我的这篇文章看下
https://blog.csdn.net/onlymayao/article/details/104783731

zend_reference是什么

引用类型对应的就是zend_reference

zend_reference的结构

struct _zend_reference {
        zend_refcounted_h              gc;
        zval                           val;
        zend_property_info_source_list sources;
};

zend_reference块解析

gc:垃圾回收机制 结构体如下

typedef struct _zend_refcounted_h {
        uint32_t         refcount;                      /* reference counter 32-bit */
        union {
                uint32_t type_info;
        } u;
} zend_refcounted_h;

val:一个zval

什么场景会用到

举例说明以及解析每行发生了什么

1 <?php
2 $a = "string";   //这是一个type为zend_string的zval
3 $b = &$a;        //a引用b 此时a和b的type都变为zend_reference,同时指向同一个zval
4 echo $a."\n";
5 echo $b."\n";
6 
7 $b = "hello";  //由于指向的是同一个zval,b的值改变,a的值也会跟着变
8 echo $a."\n";
9 echo $b."\n";
10 
11 unset($b);   //这步只是删除了b  只是把b对应的zval改成了null type为0,而a依然是zend_reference,不影响
12 echo $b."\n";
13 echo $a."\n";
14 ?>

执行结果

string
string
hello
hello

hello

涉及到的面试题举例

$a = 1;
$x =&$a;
$b=$a++;

echo $b."\n";
echo $a."\n";
echo $x."\n";

运行结果

1
2
2

我觉得大家看了我上面讲的东西后,对于a和x的结果没有什么异议,比较疑惑的应该是b为什么是1对吧?

对于b=a++,++的位置很关键,前加本次就表现出来,而后加下一次才会表现出来。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值