php对象的赋值是引用赋值,可以参考之前一篇文章PHP之道–对象和引用;
深拷贝:赋值完全复制,两个对象完全独立,其中一个对象的属性做出改变时不会影响到另一个。
浅拷贝:引用赋值,相对于取了一个别名,其中一个对象属性做出修改会影响到另一个。
对象的调用
1 | class a{ |
对象赋值,浅拷贝。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b,也就说取了另一个名字而已,指向的内存空间还是一样的。如果想要完全独立出来一个对象,互不影响,这就涉及到clone深拷贝
Clone函数
clone函数在克隆对象时候,普通属性是深拷贝,但原对象的对象属性还是引用赋值,浅拷贝,看代码理解:
1 | class Test { |
魔术方法__clone实现真正深拷贝
为了实现全部属性的深拷贝,可以使用魔术方法__clone
1 |
|
序列化反序列化
如果每次都要去类里面修改__clone会很不方便,而且还必须把所有对象属性都放在__clone里面保证全部深拷贝。可以使用serialize序列化,unserialize反序列化实现对象深拷贝
1 |
|
json_encode之后再json_decode,实现赋值也能达到同样效果
原文参考:[PHP中对象的深拷贝与浅拷贝];