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

<?php

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

$b = $a ;

当修改了 $a 或 $b 任意一个副本时,PHP 将分配所需的内存来进行复制:

1

$b [] = 'dwarf' ;

说完普通数据类型,就是对象了。对象传递的是引用,如果直接用简单的赋值,那实际上指向的同一个对象实例,修改其中一个,另外一个肯定会变。

实现深拷贝,需要使用clone 方法。实现浅拷贝直接用赋值 ”=“即可。

$object2 = clone $object1;

对于深拷贝还要多说一点,如果对象本身还嵌套着对象,那么嵌套的对像还是浅拷贝的。

这一点来讲和python的copy方法差不多。

--------EOF---------
微信分享/微信扫码阅读