淺拷貝及深拷貝、基本數據類型及引用數據類型
先簡單描述下深拷貝和淺拷貝的概念。
深拷貝:賦值時值完全復制,完全的copy,對其中一個作出改變,不會影響另一個
淺拷貝:賦值時,引用賦值,相當於取了一個別名。對其中一個修改,會影響另一個
基本類型是儲存在棧內存空間,引用類型是儲存在堆內存空間。(我私以為和線性表和非線性表有關,這里只是做下記錄。)
$a = 1; //基本數據類型
$b = $a;
$b = 2;
print($a,$b); // 1,2
在PHP中數組賦值也是深拷貝,但是在Java中數組就是淺拷貝。
$a = array(1,2,3,4,5);
$b = $a;
$b[2] = 100;
var_dump($a,$b); //[1,2,3,4,5] [1,2,100,4,5]
public class Main {
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
int[] b = a;
b[2] = 100;
System.out.println(Arrays.toString(a)); // [1, 2, 100, 4, 5]
}
}
而實例化的對象在=賦值中都是淺拷貝
class A{
public $num = 1;
}
$a = new A;
$b = $a;
$b->num = 100;
print($a->num); // 100
在PHP中提供了深拷貝的方法clone。
class A{
public $num = 1;
}
$a = new A;
$b = clone($a);
$b->num = 100;
print($a->num); //1
同樣的深拷貝方法還有轉成json字符串,json_encode(),json_decode();
或者使用序列化函數serialize和unserialzie。