『PHP内核』PHP 7 引用(Reference)类型

文章目录

  • 引用(Reference)
  • 创建引用变量
  • 创建引用变量发生了什么?
  • 参考

引用(Reference)

引用是PHP 7 十种常规数据类型之一,其在zend_types.h内被声明
『PHP内核』PHP 7 引用(Reference)类型_第1张图片
引用不是一种独立的类型,而是一个类似C语言的指针,“指向”其他数据的一种结构。对引用类型操作相当于操作其引用的变量,它的结构很简单:由一个引用计数器zend_refcounted_h和一个zval变量容器构成
『PHP内核』PHP 7 引用(Reference)类型_第2张图片

创建引用变量

PHP中通过取地址符&生成一个引用变量

$b = &$a;

通过xdebug_debug_zval(string val_Name)可以判断一个变量是不是引用变量


$a = '1';
xdebug_debug_zval('a'); //a:(refcount=0, is_ref=0)string '1' (length=1)
$b = &$a;
xdebug_debug_zval('b'); //b:(refcount=2, is_ref=1)string '1' (length=1)
xdebug_debug_zval('a'); //a:(refcount=2, is_ref=1)string '1' (length=1)

xdebug_debug_zval显示的flagis_ref标记一个变量是不是引用类型,可以看出如果一个变量引用了另一个变量,那么二者都变成了引用变量

创建引用变量发生了什么?

当执行创建引用变量的操作,如$b = &$a;时:由于zval和zend_value分离
,$a的zend_value类型由string转换为reference,然后指向新分配的结构zend_reference。它的zend_value再转换为string指向zend_string的zend_value,相当于中间插了一个“指针”,然后$b也跟随$a指向zend_reference。可以借助《PHP7内核剖析》一书中的例图来理解:
『PHP内核』PHP 7 引用(Reference)类型_第3张图片
引用变量只能用&创建,无法用赋值创建,也就等效于不存在多重指针的说法:


$a = "1";
$b = &$a;
$c = $b;
xdebug_debug_zval('c'); //c:(refcount=1, is_ref=0)string '1' (length=1)

此时$c的zend_value是直接指向zend_string的,并且类型是string

参考

《PHP7内核剖析》

欢迎在评论区留言,欢迎关注我的CSDN @Ho1aAs

你可能感兴趣的:(#,PHP内核,php内核,引用,数据类型,reference,is_ref)