PHP浅拷贝、深拷贝简析-阿里云开发者社区

开发者社区> 开发与运维> 正文

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章