本文共 1634 字,大约阅读时间需要 5 分钟。
前言:
在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 */ |
结论:对象的克隆是浅拷贝