前言:
在PHP中, “=” 作为赋值符号,对于普通变量是深拷贝,对于对象来说是浅拷贝(对象的赋值是引用赋值)。
注意:对象作为参数传递时,也是引用传递,无论函数定义时参数前面是否有&符号。
简述:
*深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个.(一直在模仿,也可以超越。) *浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个.(命运共同体,一荣俱荣,一损俱损)
实践:
1.普通变量的深拷贝的实现
//普通变量的深拷贝的实现 $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.普通变量的浅拷贝的实现
//普通变量的浅拷贝的实现 $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.对象深拷贝的实现
//对象深拷贝的实现 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.对象浅拷贝的实现
//对象浅拷贝的实现 $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 */
结论:对象的克隆是浅拷贝
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。