[基礎篇]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

感謝

感謝你看到這裏,但願本篇能夠幫到你。有問題可在評論區留言,謝謝

相關文章
相關標籤/搜索