php引用变量是什么?php引用变量的实例讲解

首页 编程分享 PHP丨JAVA丨OTHER 正文

anonymous 转载 编程分享 2017-02-07 06:40:11

简介 是什么?如何定义引用变量?本篇文章将从内存空间上简述PHP中引用变量的基本概念、工作方式,以及一个常见的实例。


php引用变量是什么?如何定义引用变量?本篇文章将从内存空间上简述PHP中引用变量的基本概念、工作方式,以及一个常见的实例。

概念

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

不同的名字访问同一个变量内容,使用&表示。

COW(copy on write)

内存优化的常见手段,在php中也采用了这种方式来优化内存。

写时复制,即只有当对其中一个或多个变量进行写操作的时候,才会复制一份内存,对其内容进行修改。

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

演示

未使用&(引用变量)

        $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());

运行结果:

内存在第一次和第二次并没有太大的差异,第三次产生较大差异

使用 &

        $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());

运行结果:

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

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

unset

unset() 只会取消引用不会销毁空间

$a=1;
$b=&$a;
unset($b);
echo $a;

输出结果:1

内存空间分析:

$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');

运行结果:

结果分析:

案例

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

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

内存变化及解析:


看不明白?解释一下:

$data = ['a', 'b', 'c'];
//1、
foreach ($data as $key => $val) { 
$val = &$data[$key]; // 进行引用传值,此时的$val内存地址被赋值为$data[0]
print_r($data);
}
//2、此时的$val内存地址为$data[0],foreach将$data[1]赋值给$val,所以$data[1]被赋值到了$data[0]
foreach ($data as $key => $val) { // $data =['b','b','c']
$val = &$data[$key]; // 进行引用传值,此时的$val内存地址被赋值为$data[1]
print_r($data);
}
//2、此时的$val内存地址为$data[1],foreach将$data[2]赋值给$val,所以$data[2]被赋值到了$data[1]
foreach ($data as $key => $val) { // $data =['b','c','c']
$val = &$data[$key]; // 进行引用传值,此时的$val内存地址被赋值为$data[2]
print_r($data);

转载链接:http://www.php.cn//php-weizijiaocheng-409595.html


Tags:


本篇评论 —— 揽流光,涤眉霜,清露烈酒一口话苍茫。


    声明:参照站内规则,不文明言论将会删除,谢谢合作。


      最新评论




ABOUT ME

Blogger:袅袅牧童 | Arkin

Ido:PHP攻城狮

WeChat:nnmutong

Email:nnmutong@icloud.com

标签云