php的拷贝浅析
之前在用Python的时候,特意研究了关于拷贝相关的知识。我想任何一个pythoner对于深拷贝和前拷贝的说法都不会陌生。具体的可看文章: Python的拷贝详解 。
对于拷贝这块,我是觉得php要比python清晰得多。
我们分普通数据类型和对象两大种数据类型来说。
普通数据类型就是包括数组,字符串,整数等等。
如果我们想实现python所说的浅拷贝,也就是让新变量只想原变量数值的内存地址。直接加上地址符”&“即可:
$a = range(0,4);
$c = &$a;
$a[0]=10;
print_r($a);
print_r($c);
输出:
Array
(
[0] => 10
[1] => 1
[2] => 2
[3] => 3
[4] => 4
)
Array
(
[0] => 10
[1] => 1
[2] => 2
[3] => 3
[4] => 4
)
如果想实现所谓的深拷贝,那旧不用地址符。嗯,看到这你应该明白,这真鸡er的简单。
解析:数组的拷贝是 值传递 。PHP 在管理内存方面有一个机制叫写时复制(COW,Copy On Write),保证了变量间复制值不浪费内存:当一个变量的值复制到另一个变量时,PHP 没有为复制值使用更多的内存,相反,它会更新符号表来说明两个变量拥有相同的内存块,所以当执行下面的代码时并没有创建一个新的数组:
1 2 3 4 |
|
当修改了 $a 或 $b 任意一个副本时,PHP 将分配所需的内存来进行复制:
1 |
|
说完普通数据类型,就是对象了。对象传递的是引用,如果直接用简单的赋值,那实际上指向的同一个对象实例,修改其中一个,另外一个肯定会变。
实现深拷贝,需要使用clone 方法。实现浅拷贝直接用赋值 ”=“即可。
$object2 = clone $object1;
对于深拷贝还要多说一点,如果对象本身还嵌套着对象,那么嵌套的对像还是浅拷贝的。
这一点来讲和python的copy方法差不多。
微信分享/微信扫码阅读