[基础篇]PHP引用变量

概述

该文章主要从内存空间上简述PHP中引用变量的基本概念、工做方式,以及一个常见的demo实例。php

概念

  • 什么是引用变量,在PHP当中,用什么符号定义引用变量?优化

    • 不一样的名字访问同一个变量内容,使用&表示。
  • COW(copy on write)spa

    • 内存优化的常见手段,在php中也采用了这种方式来优化内存。
    • 写时复制,即只有当对其中一个或多个变量进行写操做的时候,才会复制一分内存,对其内容进行修改。debug

      在PHP中使用 memory_get_usage()观察内存变化

演示

未使用&(引用变量)3d

$a = range(0,1000);
        var_dump(memory_get_usage());
        $b = $a;`
        var_dump(memory_get_usage());
        $a = range(0,1000);
        var_dump(memory_get_usage());

运行结果:
clipboard.pngcode

内存在第一次和第二次并无太大的差别,第三次产生较大差别

使用 &对象

$a = range(0,1000);
        var_dump(memory_get_usage());
        $b = &$a;
        var_dump(memory_get_usage());
        $a = range(0,1000);
        var_dump(memory_get_usage());

运行结果:blog

clipboard.png

在使用引用传值内存解析分析:ip

clipboard.png

$a被赋值时在内存中占据A内存空间, $b=&$a$b指向同一内存空间,当 $a发生改变时 $b所占据的内存空间会跟随 $a变化

unset

unset() 只会取消引用不会销毁空间
$a=1;
$b=&$a;
unset($b);
echo $a;

输出结果:1内存

内存空间分析:
clipboard.png

$a被赋值 $b=&$a以后 $a与$b直行同一内存空间,当 unset($b)时取消了 $b$a的引用,使 $b不在指向 $a的内存空间

题外话

对象自己就是引用传递
class Person
{
    public $name="zhangsan";
}
$p1 =new Person;
xdebug_debug_zval('p1');
$p2 =$p1;
xdebug_debug_zval('p1');
$p2->name="lisi";
xdebug_debug_zval('p1');

运行结果:
clipboard.png

结果分析:

clipboard.png

对象被实例后经引用传递以后 $p1 $p2指向的始终是同一内存空间

案例

<?php
    
     $data = ['a', 'b', 'c'];
    
     foreach($data as $key => $val)
     {
          $val = &$data[$key];
     }
    var_dump($data);

写出如上程序的输出结果?
程序运行时,每一次循环结束后变量$data的值是什么?
程序执行完成后,变量$data的值是什么?

内存变化及解析:

clipboard.png

感谢

感谢你看到这里,但愿本篇能够帮到你。有问题可在评论区留言,谢谢

相关文章
相关标签/搜索