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

遇到一个面试题

$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."
";

echo '初始内存大小:'.memory_get_usage()."
";

$a = 1;

echo '执行$a = 1后内存变成:'.memory_get_usage()."
";

$b=$a;

$a=2;

echo '执行$a=2后内存变成:'.memory_get_usage()."
";

输出:

PHP版本:7.0.15

初始内存大小:6409416

执行$a = 1后内存变成:6409416

执行$a=2后内存变成:6409416

我发现内存竟然没有变化,验证失败了。

第二种验证方式:

我用的是php 的debug_zval_dump

我的环境是php7,但是这个函数似乎不支持int类型的数据,

我不得不重新弄一个类似的例子来验证:

echo PHP_VERSION."
";

$a = 'a';

debug_zval_dump($a);

echo "
";

$b=$a;

debug_zval_dump($a);

echo "
";

$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


string(1) "a" refcount(1)


string(1) "a" refcount(1)


string(2) "a1" refcount(1)

一样的结果。

然后我就去看一下php文档,发现我中文档中的

我也执行:

echo 'PHP版本:'.PHP_VERSION."
";

$var1 = 'Hello World';

debug_zval_dump($var1);

输出:

PHP版本:7.0.15

string(11) "Hello World" refcount(1)

而文档的输出是 refcount值为2

我的这一条验证之路也被堵死了,

请各位大神给我点指导意见,是在是弄不出来了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值