PHP的陣列是按值傳遞及按引用傳遞解析

2021-09-11 16:47:23 字數 4311 閱讀 2292

簡單變數和物件好理解:

<?php

// 簡單變數的拷貝

$a = 'human';

$b = $a;

$b = 'cat';

var_dump($a); // string 'human' (length=5)

// 物件的拷貝

class a{}

$a = new a();

$b = $a;

$b->name = 'jack';

var_dump($a); // object(a)[1] public 'name' => string 'jack' (length=4)

物件 $a 和 物件 $b 的記憶體位址指向了同乙個地方,即針對 $a 和 $b 所做的操作都針對同乙個例項。

php 中可以通過 clone 關鍵字按值拷貝物件:使用clone時將按值傳遞

<?php

classa

$a=newa();

$b=clone$a;

$b->name ='dee';

var_dump($a);// object(a)[1] public 'name' => string 'vardy' (length=5)

var_dump($b);// object(a)[2] public 'name' => string 'dee' (length=3)

陣列:<?php

// 陣列的拷貝

$a= ['human','orc'];

$b=$a;

$b[0] ='elve';

var_dump($a);

// array (size=2)

//   0 => string 'human' (length=5)

//   1 => string 'orc' (length=3)

這樣看,陣列的拷貝是按值傳遞的.

另乙個例子 陣列的迭代器:

<?php

$a= ['human','orc','elven','undead'];

next($a);

$b=$a;// 此時指標位置也隨著陣列的複製而複製

var_dump(current($a));// string 'orc' (length=3)

var_dump(current($b));// string 'orc' (length=3)

當陣列拷貝時,陣列的指標位置也隨著複製。

(next:

current:

<?php

$a= ['human','orc','elven','undead'];

end($a);

next($a);// 陣列指標非法,返回 false

$b=$a;

var_dump(current($a));// string 'human' (length=5)

var_dump(current($b));// boolean false

當陣列在拷貝前,指標的位置是非法時,拷貝後分別列印兩個陣列指標所指向的當前單元時,出現了不一樣的情況。

原因是陣列變數發生拷貝後,兩個變數中先發生寫操作的,其指標被初始化,即指向第乙個元素,這裡的**中使用的 current 方法也會產生寫操作,因此 $a 的陣列被初始化後指標當前指向的是 'human',而 $b  current 方法則返回 false。

以下**同理, $b 首先發生了寫操作:

<?php

$a= ['human','orc','elven','undead'];

end($a);

next($a);

$b=$a;

$b='dwarf';

var_dump(current($a));// boolean false

var_dump(current($b));// string 'human' (length=5)

解析:陣列的拷貝是值傳遞。php 在管理記憶體方面有乙個機制叫寫時複製(cow,copy on write),保證了變數間複製值不浪費記憶體:當乙個變數的值複製到另乙個變數時,php 沒有為複製值使用更多的記憶體,相反,它會更新符號表來說明兩個變數擁有相同的記憶體塊,所以當執行下面的**時並沒有建立乙個新的陣列:

<?php

$a= ['human','orc','elven','undead'];

$b=$a;

當修改了 $a 或 $b 任意乙個副本時,php 將分配所需的記憶體來進行複製:

$b='dwarf';

此時記憶體將被重新分配。

PHP 陣列的拷貝是按值傳遞 or 按引用傳遞

在記憶中 php 簡單變數的拷貝是按值傳遞,陣列和物件的拷貝是按引用傳遞,即通過引用來實現。簡單變數和物件好理解 簡單變數的拷貝 a human b a b cat var dump a string human length 5 物件的拷貝 class a a new a b a b name j...

JavaScript 按值傳遞 按引用傳遞

1 值的比較 引用的比較 首先,原始值的比較是值的比較 只有在它們值相等的時候它們才相等 比如簡單的 var a1 10 var a2 10 console.log a1 a2 true 其次,物件的比較並非值的比較 物件的比較均是引用的比較,當且僅當它們引用同乙個基物件時,它們才相等。即使兩個物件...

按值傳遞和按引用傳遞

對於基本型別而言,是按值傳遞的 基本型別儲存在棧中 基本型別引數的傳遞和基本型別的複製一樣,傳遞的是值本身 var a 1 function test x test a console.log a 1按值傳遞的意思就是形參是實參的複製,形參實參互不干擾 so,雖然在函式test中a被修改,但是並沒有...