在php 中引用的意思是:不同的名字訪問同乙個變數內容.使用&表示
2.1、不使用 &
$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());
執行結果:內存在第一次和第二次並沒有太大的差異,第三次產生較大差異
2.2、使用 &
$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,$b引用的同乙個位址,就不需要開闢新位址
xdebug 的安裝方法 網上很多,這裡不細講(php 的乙個擴充套件外掛程式而已)
3.1、不使用 &
//執行如下:zval 變數容器
$a = range(0, 3
);xdebug_debug_zval('a
');//定義變數b,把a的值賦值給b
$b =$a;
xdebug_debug_zval('a
');//修改a
$a = range(0, 3
);xdebug_debug_zval('a
');
refcount用以標識指向這個zval變數容器的變數個數
is_ref(bool),標識此變數是否屬於引用集合
第二步只進行了copy 操作,使$a , $b 指向同乙個記憶體位址, refcount = 2,而第三步 發生了寫操作(is_ref=0 不是引用),重新開闢了記憶體位址,refcount= 1
3.2、使用 &
//執行結果:zval 變數容器
$a = range(0, 3
);xdebug_debug_zval('a
');//定義變數b,把a的值賦值給b
$b = &$a;
xdebug_debug_zval('a
');//修改a
$a = range(0, 3
);xdebug_debug_zval('a
');
採用了 引用(&),所以 從第二步開始 refcount = 2,is_ref = 1(引用) ,引用狀態下不開闢新的記憶體位址;
php 中 object 本身就是引用傳值(自 php 5 起,new 自動返回引用,因此在此使用 =& 已經過時了並且會產生 e_strict 級別的訊息。)
//執行結果:物件本身就是引用傳遞
class
person
$p1 = new
person;
xdebug_debug_zval('p1
');$p2 =$p1;
xdebug_debug_zval('p1
');$p2->name = 'ls'
;xdebug_debug_zval('p1
');
object 賦值情況下 會共享記憶體位址,但本身又不是引用。
//執行結果:unset 只會取消引用,不會銷毀空間
$a = ''
;xdebug_debug_zval('a
');$b = &$a;
xdebug_debug_zval('a
');unset($b);
xdebug_debug_zval('a
');
所以在第一步的時候 refcount = 0
對應 引用(&),unset只會取消引用,而不會銷毀記憶體位址
通過對 is_ref 判斷是否是引用變數,如果是引用變數,修改時直接修改(原記憶體位址),否則,則需要進行 分離(重新開闢新位址),而 usset 變數只是取消該變數的引用,而不會消除記憶體位址,只有當refcount = 0;記憶體才有可能被**
php引用變數
php引用變數 cow copy on write php變數在賦值的時候不會新開闢乙個記憶體空間,只有在變數有改變操作的時候才會開闢新的記憶體空間 定義變數a a range 0,10000 var dump memory get usage 將變數a賦值給變數b b a var dump mem...
php 引用變數
定義 不同變數名指向同一變數內容 位址 符號 定義變數 a,記憶體開闢乙個空間儲存 a a指向該空間 a a 定義變數 b,因為cow copy on write 特性,a,b都引向 a b a 如果改變 a的值,記憶體又開闢空間儲存,a指向該空間。此時 b還是指向原來的空間 a hello 可以使...
PHP引用變數
在php中引用意味著用不同的名字訪問同乙個變數內容使用 符號 定義變數 a range 0 100 var dump memory get usage int 399112 xdebug debug zval a a refcount 1,is ref 0 recount表示變數指向的記憶體位址引用...