浅拷贝及深拷贝、基本数据类型及引用数据类型
先简单描述下深拷贝和浅拷贝的概念。
深拷贝:赋值时值完全复制,完全的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。