1. 概述

1.1 什么是深拷贝和浅拷贝

  • 深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个。
  • 浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个。

    1.2 如何进行深浅拷贝

    PHP4 中等号是完全深拷贝的。
    PHP5 中等号赋值时,当赋值为普通值时,是深拷贝,当赋值是对象时是浅拷贝。这时如果希望进行对象的深拷贝,就需要关键字 clone 来实现。虽然 clone 能进行对象的深拷贝,但是其深拷贝是不递归的(如果拷贝的对象的成员变量仍然是对象,则改属性也是浅拷贝),如果需要完全的深拷贝,需要用别的方法。

    2. 对象深拷贝

    对象的完全深拷贝有两个办法:

    1. 通过魔术方法__clone()
    2. 通过序列化与反序列化

      2.1 编辑 __clone()

      1. <?
      2. class TestOne {
      3. public $b = 1;
      4. public $obj;
      5. public function __clone() {
      6. $this->obj = clone $this->obj;
      7. }
      8. }

      2.2 序列化与反序列化

      1. <?
      2. class TestOne {
      3. public $b = 1;
      4. public $obj;
      5. public function deepClone() {
      6. $tmp = serialize($this);
      7. $newObj = unserialize($tmp);
      8. return $newObj;
      9. }
      10. }