該文章主要從內存空間上簡述PHP中引用變量的基本概念、工做方式,以及一個常見的demo實例。php
什麼是引用變量,在PHP當中,用什麼符號定義引用變量?優化
COW(copy on write)spa
寫時複製,即只有當對其中一個或多個變量進行寫操做的時候,纔會複製一分內存,對其內容進行修改。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());
運行結果:code
內存在第一次和第二次並無太大的差別,第三次產生較大差別
使用 &對象
$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
在使用引用傳值內存解析分析:ip
$a
被賦值時在內存中佔據A內存空間,$b=&$a
時$b
指向同一內存空間,當$a
發生改變時$b
所佔據的內存空間會跟隨$a
變化
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');
運行結果:
結果分析:
對象被實例後經引用傳遞以後$p1
$p2
指向的始終是同一內存空間
<?php $data = ['a', 'b', 'c']; foreach($data as $key => $val) { $val = &$data[$key]; } var_dump($data);
寫出如上程序的輸出結果?
程序運行時,每一次循環結束後變量$data的值是什麼?
程序執行完成後,變量$data的值是什麼?
內存變化及解析:
感謝你看到這裏,但願本篇能夠幫到你。有問題可在評論區留言,謝謝