php 引用傳遞和值傳遞深入解析

2021-09-14 03:25:53 字數 2400 閱讀 8166

先來張圖,然後再講後面的

按值傳遞

函式範圍內對值的任何改變在函式外部都會被忽略

值傳遞是把值拷貝乙份,兩個變數指向兩個記憶體位址

值傳遞沒什麼好說的,就是普通的賦值,如下:

$a=6

;$b=$a

;// 這是值傳遞,把 $a 的值拷貝給了 $b,在記憶體中 $a 和 $b 不在乙個位址中,更改任意變數的值對對方無影響$b=

7;echo$a;

// 輸出:6

function

foo($b)

foo($b)

;// 輸出:8

echo$b;

// 輸出:7 說明函式內的改變對函式外的值沒有影響,因為,當 $b 傳入函式內的時候是值傳遞,會把值在記憶體中拷貝乙份存入乙個新的記憶體位址中

按引用傳遞

函式範圍內對值的任何改變在函式外部也能反映出這些修改

引用傳遞是將乙個變數的記憶體位址標識傳給了內外乙個變數,兩個變數最終指向記憶體同乙個位址

引用傳值一

重點是引用傳遞

以及引用傳遞易犯錯誤說明,如下:

$a=6

;$b=&

$a;$b=

7;echo$a;

// 輸出:7

function

foo(&$c

)foo($b

);// 輸出:8

echo$b;

// 輸出:8 說明函式內的改變對函式外的值有影響,因為,當 $b 傳入函式內的時候是引用傳遞,函式體內的$b和外部的$b實際上是指向同乙個記憶體位址,所以乙個改變,另外乙個變數的值也會改變

引用傳值高階示例:

function

func(&

$arr

)$arr=[

'a'=

>

'111'

,'b'

=>

'222'];

func

($arr);

var_dump

($arr);

/**# 第乙個輸出:

array(1)

# 第二個輸出:

array(2)

["b"]=> string(3) "222"

}*/

上面的示例明明還是引用傳遞進去的為啥會兩個$arr列印出不一樣的結果呢?

因為裡面有一步操作$arr = &$arr['a'];這一步之後函式內的$arr的指向位址已經改變,指向了$arr['a'],所以兩次列印的結果不一樣注意

php 中對於物件預設引用傳值

一般引用傳值用在需要在函式體內改變傳入引數並且需要影響外部變數的時候使用,其他時候一般使用值傳遞

php寫時拷貝

php 中對於位址的指向(類似指標)功能不是由使用者自己來實現的,是由 zend 核心實現的,php 中引用採用的是 「寫時拷貝」 的原理,就是除非發生寫操作,指向同乙個位址的變數或者物件是不會被拷貝的。

通俗的講

1: 如果有下面的**

$a="abc";

$b=$a;

其實此時 $a 與 $b 都是指向同一記憶體位址而並不是 $a 與 $b 占用不同的記憶體

2: 如果在上面的**基礎上再加上如下**

$a="efg";
由於 $a 與 $b 所指向的記憶體的資料要重新寫一次了,此時 zend 核心會自動判斷自動為 $b 生產乙個 $a 的資料拷貝,重新申請一塊記憶體進行儲存。

php 引用於 c 指標的區別

在 php 中引用的意思是:不同的名字訪問同乙個變數內容.

與c語言中的指標是有差別的.c語言中的指標裡面儲存的是變數的內容在記憶體中存放的位址。

php 的引用允許你用兩個變數來指向同乙個內容(引用傳值相當於給變數起了個別名)

當你 unset 乙個引用,只是斷開了變數名和變數內容之間的繫結。這並不意味著變數內容被銷毀了。

可能對你理解這個示例有幫助的文章:

1、指標和記憶體

2、一 維陣列和二維陣列記憶體示意圖

3、十個 php 開發者最容易犯的錯誤

4、php 函式值傳值 / 位址以及引用的用法

php引用傳遞和值傳遞

主要是實參和形參的相互影響性。引用傳遞 形參的改變會影響實參 值傳遞 賦值,不相互影響 引數引用傳遞 pams1 1 function ssr params 這裡的引數的沒有 pams2 ssr pams1 echo 1 pams1 1 echo echo 2 pams2 4 echo pams1 ...

php 值傳遞和引用傳遞

a 3 b 4 引用傳遞 加 賦值後 全域性變數隨之改變稱為 引用傳遞 引用傳遞 不加 賦值後 區域性方法裡面變數會生成乙個值代替他 我們簡稱為 tmp 在方法裡面運算 然後返回給這個值 所以真實的數值沒有改變 function change c change a echo a echo 但是物件本...

值傳遞和引用傳遞

幾乎每種語言都有值傳遞和引用傳遞.下面是我的一些曲解,只講現象,不涉及到任何的原理,主要是鬧著玩的.a 新交了個女朋友b.有一天他女朋友b看見a在吃冰激凌,b想吃,但是a是個 座有點小潔癖,不想讓b吃,於是給b買了個新的冰激凌說你吃這個吧,別碰我嘴裡這個.這就是值傳遞.a和b的值沒有任何關係,他們一...