PHP變量傳值賦值和引用賦值,變量銷毀


    $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 ?>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM