一个对象变量直接赋值给另一个变量,它们传的值只是“对象标识符”。有时候我们不想传“对象标识符”,而是完全的复制出一个新对象,这里就要用到一个关键字clone。
第10行代码,对象变量$o2完全克隆的$o1,它们的对象标识符不一样的。
前面我们做的例子还从没有这样写过,就是一个类的属性是一个对象数据,看下面的例子:
A类的$b1属性的值是B类的一个实例化对象。
我们在看看$o1、$o2这两个对象:
$o1克隆出了$o2,它们都有一个属性$b1,这个属性$b1存的都是对象标识符“object(B)#2”。也就是说$o1克隆$o2时,并没有把$o1里的对象属性$b1克隆,而只是和属性$a1一样简单地传值。像这样的克隆只能是浅克隆。
如果$o1克隆出$o2时,把$o1的所有对象属性也都要克隆而不是简单地传值,像这样的克隆就是深克隆。
php中,默认克隆是浅克隆。
要想实现深克隆(一个对象的所有属性数据都彻底实现了“复制”),就需要对该对象类使用魔术方法:
__clone(),并在里面来实现深度克隆——人为去复制浅克隆复制不了数据。
则刚才的代码,改进如下:
克隆就这些内容,迄今为止楠神也从没用过clone这个功能,没发现有什么应用场景,有需要新对象时大多都是new一个新对象,从没想过去clone出一个对象。