为了账号安全,请及时绑定邮箱和手机立即绑定

$a = 1; $b=$a; $a=2; 这段代码的内存是怎样分配的?

$a = 1; $b=$a; $a=2; 这段代码的内存是怎样分配的?

PHP
慕码人8056858 2019-03-15 16:34:25
遇到一个面试题$a = 1; $b=$a; $a=2; 这段代码的内存是怎样分配的? 通过我在网上的查询得到两种不同的观点: 1)一种是 $a = 1; 首先给$a分配一个内存 地址一 并且它里面存的值是 1 $b=$a; 将$a的变量容器复制一份,成为一个新的变量容器,$b指向这个容器(在这一步就进行了复制变量容器操作) $a=2; 这时改变$a的值变成2,就不会影响$b的值了 2)另一种方案就是 $a = 1; 首先给$a分配一个内存 地址一 并且它里面存的值是 1 $b=$a; 将$b的也指向$a的地址一,此时不进行复制变量容器操作 $a=2; 这时需要改变$a的值变成2,这时就需要复制$a 这个变量容器,让$b指向这个新的变量容器地址。 接下来就是我的验证方式了,第一种方式:我是从内存变化的角度来说明: echo 'PHP版本:'.PHP_VERSION."<br>"; echo '初始内存大小:'.memory_get_usage()."<br>"; $a = 1; echo '执行$a = 1后内存变成:'.memory_get_usage()."<br>"; $b=$a; $a=2; echo '执行$a=2后内存变成:'.memory_get_usage()."<br>"; 输出: PHP版本:7.0.15 初始内存大小:6409416 执行$a = 1后内存变成:6409416 执行$a=2后内存变成:6409416 我发现内存竟然没有变化,验证失败了。 第二种验证方式: 我用的是php 的debug_zval_dump 我的环境是php7,但是这个函数似乎不支持int类型的数据, 我不得不重新弄一个类似的例子来验证: echo PHP_VERSION."<br>"; $a = 'a'; debug_zval_dump($a); echo "<br>"; $b=$a; debug_zval_dump($a); echo "<br>"; $a='a1'; debug_zval_dump($a); 输出: 7.0.15 string(1) "a" refcount(1) string(1) "a" refcount(1) string(2) "a1" refcount(1) 这时问题就来了,为什么refcount值始终是1,难道执行完 $b=$a;不是应该 refcount的值加一吗 我怀疑是我的php版本问题,我又去php7.1上执行 输出: 7.1.1 <br>string(1) "a" refcount(1) <br>string(1) "a" refcount(1) <br>string(2) "a1" refcount(1) 一样的结果。 然后我就去看一下php文档,发现我中文档中的 我也执行: echo 'PHP版本:'.PHP_VERSION."<br>"; $var1 = 'Hello World'; debug_zval_dump($var1); 输出: PHP版本:7.0.15 string(11) "Hello World" refcount(1) 而文档的输出是 refcount值为2 文档链接 我的这一条验证之路也被堵死了, 请各位大神给我点指导意见,是在是弄不出来了。
查看完整描述

6 回答

?
米脂

TA贡献1836条经验 获得超3个赞

这个考的主要是copy on write ,php 写时复制。附上鸟哥and pi的文章,希望对你有用。
深入理解php原理之变量分离

php internal copy on write

查看完整回答
反对 回复 2019-03-18
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

函数 xdebug_debug_zval() 的参数是字符串类型的吧,你是不是参数用错了!引用计数基本知识

查看完整回答
反对 回复 2019-03-18
?
慕容708150

TA贡献1831条经验 获得超4个赞

php7不再对简单值进行引用计数

查看完整回答
反对 回复 2019-03-18
  • 6 回答
  • 0 关注
  • 590 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信