PHP傳值和傳引用、傳地址的區別是什麼?

 

傳值,

   是把實參的值賦值給行參

   那麼對行參的修改,不會影響實參的值

 

   傳地址

   是傳值的一種特殊方式,隻是他傳遞的是地址,不是普通的如int

   那麼傳地址以後,實參和行參都指向同一個對象

 

   傳引用

   真正的以地址的方式傳遞參數

   傳遞以後,行參和實參都是同一個對象,隻是他們名字不同而已

   對行參的修改將影響實參的值

 

———————————————————————————–

 

覺得從函數調用的角度理解比較好

 

   傳值:

   函數參數壓棧的是參數的副本。

   任何的修改是在副本上作用,沒有作用在原來的變量上。

 

   傳指針:

   壓棧的是指針變量的副本。

   當你對指針解指針操作時,其值是指向原來的那個變量,所以對原來變量操作。

 

   傳引用:

   壓棧的是引用的副本。由於引用是指向某個變量的,對引用的操作其實就是對他指向的變量的操作。(作用和傳指針一樣,隻是引用少瞭解指針的草紙) 

 

———————————————————————————–

函數參數傳遞機制的基本理論

     函數參數傳遞機制問題在本質上是調用函數(過程)和被調用函數(過程)在調用發生時進行通信的方法問題。基本的參數傳遞機制有兩種:值傳遞和引用傳遞。以下討論稱調用其他函數的函數為主調函數,被調用的函數為被調函數。

     值傳遞(passl-by-value)過程中,被調函數的形式參數作為被調函數的局部變量處理,即在堆棧中開辟瞭內存空間以存放由主調函數放進來的實參的值,從而成為瞭實參的一個副本。值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。

     引用傳遞(pass-by-reference)過程中,被調函數的形式參數雖然也作為局部變量在堆棧中開辟瞭內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過堆棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響瞭主調函數中的

   實參變量。

 

 

———————————————————————————–

 

僅討論一下值傳遞和引用:

   所謂值傳遞,就是說僅將對象的值傳遞給目標對象,就相當於copy;系統將為目標對象重新開辟一個完全相同的內存空間。

   所謂引用,就是說將對象在內存中的地址傳遞給目標對象,就相當於使目標對象和原始對象對應同一個內存存儲空間。此時,如果對目標對象進行修改,內存中的數據也會改變。

$a = 'c';

 

$b = &$a; //表示$b 和$a 引用瞭同一個變量

 

$a = 'abc'; //這裡重置瞭$a

 

echo $b; //將輸出abc

 

unset($a);//取消引用

 

echo $b;//這裡仍輸出abc

 

$a = 'abcd';

 

echo $b;//因為已經取消引用 這裡仍輸出abc

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *