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