完全理解PHP中的变量引用
admin
2023-06-13 08:43:00
0

在PHP面试中,经常会遇到这样一道问题:
什么是变量引用,用什么符号表示?

这个其实很简单,变量引用简单来说就是不同的变量名称指向同一个值。用&符号表示。

初学PHP,都知道变量的声明与赋值为:

$a = str_replace("hello world",40);

我们可以将值再赋给$b

$b = $a;

这样$a,$b都等于hello world,那在内存中是不是开辟了2个空间来存储呢?我们可以使用memory_get_usage()来查看:

$a =str_replace( 'hello world',40);
var_dump(memory_get_usage());
$b = $a;
var_dump(memory_get_usage());

你会发现内存的值没有变化。也就是说变量a和b都指向了同一个内存地址。

这里设计PHP的一个重要原则,是COW,即copy on write,意思就是说只有在真的写入的时候,才会复制出一块内存地址。

那我们继续看:

var_dump(memory_get_usage());
$a = str_repeat('hello world',40);
var_dump(memory_get_usage());
$b = $a;
var_dump(memory_get_usage());
$a = str_repeat('hello teacher',40);
var_dump(memory_get_usage());

以上的代码,就会发现当$a重新赋值时,内存占用发生了变化 。

那再来看变量引用

var_dump(memory_get_usage());
$a = str_repeat('hello world',1);
var_dump(memory_get_usage());
$b = &$a;
var_dump(memory_get_usage());
$a = str_repeat('hello teacher',1);
var_dump(memory_get_usage());

echo $a;
echo '----------';
echo $b;

使用&符号以后,变量a和b使用一块内存地址,a发生变化后,b也随着变化.


往底层来考虑

zval是php中最重要的数据结构之一。

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 */
};
typedef struct _zval_struct zval;

以上是一段C语言代码,这是zval的定义,一共有四个值,
zvalue是变量的实际值
uchar 是变量的的类型,比如PHP中的常用变量:bool、int、float、array、string、object、NULL等
refcount_gc:是一个计数器,当我们把变量覆值给另一个变量时,计数器加1,unset计数器减1,简单来说就是有多少个变量指向它。
is_ref__gc:这个值分为0和1,代表是否为引用变量

结论就是PHP底层的数据结构设计 决定了引用变量和变量赋值的原理。

注:对象类型本身就是引用传递。

相关内容

热门资讯

王毅会见巴军方高层,谈及伊朗局... 据凤凰卫视报道,中共中央政治局委员、外交部长王毅5月25日在人民大会堂会见巴基斯坦国防军司令兼陆军参...
何妨把课堂打造成学术“直播间” 评论员说 何妨把课堂打造成学术“直播间” ■ 本报评论员 刘晓庆 其实,不只是大学课堂越来越“静悄悄...
空间站完成第8次“太空会师” 5月25日在北京航天飞行控制中心飞控大厅拍摄的神舟二十一号航天员乘组和神舟二十三号航天员乘组拍摄“全...
美军称在伊朗南部实施自卫打击 央视记者获悉,美国中央司令部发言人蒂姆·霍金斯上尉表示,美军25日在伊朗南部实施了自卫打击,“旨在保...
小米押注!闪回科技四次递表港交... 【大河财立方消息】5月25日,闪回科技有限公司(以下简称闪回科技)在港交所提交上市申请,独家保荐人为...
神舟二十三号飞船发射任务圆满成... 乘组一名航天员将开展一年期在轨驻留试验 神舟二十三号飞船发射任务圆满成功 北京时间5月24日23时0...
西安警方:女孩与父亲争执被路人... 5月25日凌晨,针对网传“16岁女孩被陌生男子殴打”一事,西安市公安局莲湖分局发布警情通报。据江西广...
力鼎光电获得外观设计专利授权:... 证券之星消息,根据天眼查APP数据显示力鼎光电(605118)新获得一项外观设计专利授权,专利名为“...
“一箭8星”再启新程!中科宇航... IT之家 5 月 25 日消息,中科宇航今日宣布,近日,力箭一号遥十四运载火箭在中科宇航产业化基地如...
鄠图科普丨一起“趣”阅读|火箭... 火箭发射是太空旅行的开始, 也是人类探索宇宙的重要一步。 火箭是载人和无人航天器进入太空的必备工具,...