$a = 100; $b = 200;
php中,上面代碼中變量是怎么存放的呢?
此時若將b賦值給a,即
傳值賦值 $a = $b; 和 引用賦值$a = &$b; 有什么區別呢?
傳值賦值就是復制過去,然后各玩各的,互不影響。
引用賦值是兩個變量指向一個盒子,一旦這樣,一改俱改。
這樣賦予變量a的就不僅僅是變量b的值,而是變量b的地址,變量a和變量b共同指向一個地址。
1 $a = 100; 2 $b = 200; 3 4 $a = &$b; //變量a的指針指向變量b的數據盒子 5 var_dump($a,$b); //int(200) int(200) 6 7 /*變量b引用賦值給變量a后,ab指向同一個地址,將會一改俱改,如下:*/ 8 $a =500; 9 var_dump($a,$b); //int(500) int(500) 一改俱改: 改a也改了b 10 $b = 700; 11 var_dump($a,$b); //int(700) int(700) 一改俱改: 改b也改了a 12 13 $c = 900; 14 $a = $c; 15 var_dump($a,$b); //int(900) int(900) 一改俱改:其他變量值復制給a,等同於直接改了盒子里的數據 16 17 $d = 1111; 18 $a = &$d; 19 var_dump($a,$b); //int(1111) int(900) 這里沒有一改俱改,$a = &$d;是把變量d引用賦值給變量a,變量a指向了新地址,變成了新值1111,變量b還是指向老地址不變。
<?php /*理解下面的話*/ $a = 100; //變量a賦值int 100 ,100是基礎數據類型,不是變量,新建一個盒子,里面存放int 100,讓a指向它 $a = $b; //變量b的值 賦值 給變量a,變量a,b各有各的指向,執行之后,各是各的。 $a = &$b; //變量b的值的地址 賦值給變量 a ,變量a,b共用一個地址哦!一改俱改! ?>
銷毀變量用unset
在php中,變量占據了兩個地方,1.花名冊中占個名字 2.存儲其值的“盒子”(其實就是內存中一塊地方)。
unset($a) ;會發生什么?
首先,會將$a這個變量扔出花名冊,於是沒有這個變量了。
其次,檢查有沒有其他變量也指向這個“盒子”,如果沒有其他變量指向這個“盒子”,再檢查盒子所占空間超過255字節長沒?超過了,盒子才會被銷毀(釋放內存)沒超過255字節,則不釋放內存(銷毀盒子)。
要想釋放內存,可以用
$a = null;的方式,這樣盒子被銷毀了,但是中花名冊中還有該變量哦!
1 /*引用賦值一改俱改,但是unset不是改盒子里的值,所以unset變量a,變量b沒變化*/ 2 $a = 200; 3 $b = &$a; 4 unset($a); 5 var_dump($a,$b); //NULL int(100)
上面的代碼,執行到unset($a)時候,就是將變量a的指向斷開,同時將變量a扔出花名冊,從下圖可以看出,對變量b是沒有影響的。
但是,如果用$a = null;這種方式銷毀變量時,將會有如下影響:
1 <?php 2 $a = 100; 3 $b = &$a; 4 $a = null; 5 var_dump($a,$b); //NULL NULL 6 ?>
這種方式,釋放了內存,但是共用一個地址的另一個變量也受到了影響。
看看這兩種方式在數組上的應用:
1 <?php 2 $aaa = array( 3 'a'=>1, 4 'b'=>2 5 ); 6 unset($aaa['a']); 7 print_r($aaa); //Array ( [b] => 2 ) ,用unset,扔出花名冊,數組中這一項不存在了 8 9 10 11 $bbb = array( 12 'a'=>1, 13 'b'=>2 14 ); 15 $bbb['a'] = null; 16 print_r($bbb); //Array ( [a] => [b] => 2 ) ,用 = null,數組中這一項還存在,只是值為空了 17 ?>