前言:
在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
*/
|
结论:对象的克隆是浅拷贝