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中一个 & 和两个 && 的区别简析
两个 && 是逻辑 “与”。 一个 & 是按位“与”。 几个例子: if (($a = 1) & ($a == 1) & ($a = 3)) { echo 'true', $a;die; } echo 'false', $a; 输出:true3 简析:表达式从左到右依次执行。
|
PHP
PHP 单一入口框架设计简析
2013年1月22日 19:35:25 大概过程:所有URL请求->重定向到index.php->加载一个类A->分析URL得到参数信息和将要调用的另一个类B->加载这个类B,并将参数信息传递给该类->执行->结束.
839 0
|
7月前
|
关系型数据库 MySQL PHP
PHP 原生操作 Mysql
PHP 原生操作 Mysql
79 0
|
7月前
|
关系型数据库 MySQL 数据库连接
PHP 原生连接 Mysql
PHP 原生连接 Mysql
107 0
|
7月前
|
关系型数据库 MySQL Unix
PHP MySql 安装与连接
PHP MySql 安装与连接
125 0
|
3月前
|
关系型数据库 MySQL PHP
|
22小时前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册