前言
在讲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++,++的位置很关键,前加本次就表现出来,而后加下一次才会表现出来。