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

  1. 遇到一个面试题
    $a = 1; $b=$a; $a=2; 这段代码的内存是怎样分配的?
  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指向这个新的变量容器地址。
    
  3. 接下来就是我的验证方式了,
    第一种方式:我是从内存变化的角度来说明:

     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
  

文档链接

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

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

慕码人8056858
浏览 591回答 6
6回答

米脂

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

慕桂英546537

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

慕容708150

php7不再对简单值进行引用计数
打开App,查看更多内容
随时随地看视频慕课网APP