PHP浅拷贝、深拷贝简析

前言:

        在PHP中, “=” 作为赋值符号,对于普通变量是深拷贝,对于对象来说是浅拷贝(对象的赋值是引用赋值)。
        注意:对象作为参数传递时,也是引用传递,无论函数定义时参数前面是否有&符号。


简述:       

    *深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个.(一直在模仿,也可以超越。)    
    *浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个.(命运共同体,一荣俱荣,一损俱损)


实践:


1.普通变量的深拷贝的实现   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//普通变量的深拷贝的实现
$a = 'zhangsan' ;
$b = $a ;
echo  $a . "\r\n" ;
echo  $b . "\r\n" ;
 
 
$b = "lisi" ;
echo  $a . "\r\n" ;
echo  $b . "\r\n" ;
 
/**
  *输出结果
  *zhangsan
  *zhangsan
  *
  *zhangsan
  *lisi
  **/

 结论:普通变量的赋值就是深拷贝


2.普通变量的浅拷贝的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//普通变量的浅拷贝的实现
$c = "wangwu" ;
$d =& $c ;
echo  $c . "\r\n" ;
echo  $d . "\r\n" ;
 
echo  "\r\n" ;
 
$d = "xiaoer" ;
echo  $c . "\r\n" ;
echo  $d . "\r\n" ;
 
/**输出结果
  *wangwu
  *wangwu
  *   
  *xiaoer
  *xiaoer
  **/

结论:普通变量的引用赋值是深拷贝


3.对象深拷贝的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//对象深拷贝的实现
class  Person{
     public  $name ;
}
 
$zhangsan = new  Person();
$zhangsan ->name= 'zhangsan' ;
 
$lisi = $zhangsan ;
 
echo  $zhangsan ->name. "\r\n" ;
echo  $lisi ->name. "\r\n" ;
 
echo  "\r\n" ;
 
$lisi ->name= 'lisi' ;
echo  $zhangsan ->name. "\r\n" ;
echo  $lisi ->name. "\r\n" ;
 
/**输出结果
  *zhangsan
  *zhangsan
  *
  *lisi
  *lisi
  */

结论:对象的赋值是深拷贝


4.对象浅拷贝的实现  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//对象浅拷贝的实现
$JackMa = new  Person();
$JackMa ->name= 'Ma Yun' ;
 
$PoneyMa = clone  $JackMa ;
echo  $JackMa ->name. "\r\n" ;
echo  $PoneyMa ->name. "\r\n" ;
 
echo  "\r\n" ;
 
$PoneyMa ->name= 'Ma Huateng' ;
echo  $JackMa ->name. "\r\n" ;
echo  $PoneyMa ->name. "\r\n" ;
 
/**输出结果
  *Ma Yun
  *Ma Yun
  *
  *Ma Yun
  *Ma Huateng
  */

结论:对象的克隆是浅拷贝










本文转自 hgditren 51CTO博客,原文链接:http://blog.51cto.com/phpme/2048235,如需转载请自行联系原作者

你可能感兴趣的:(PHP浅拷贝、深拷贝简析)