简析clone关键字与__clone()方法
一、对象复制
1、需求
在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。
还有一种情况,如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本
2、基本概念
有的时候我们需要在一个项目里面使用两个或多个一样的对象,如果使用 new 关键字重新创建对象,再赋值上相同的属性,这样做比较烦琐而且也容易出错。PHP 提供了对象克隆功能,可以根据一个对象完全克隆出一个一模一样的对象,而且克隆以后,两个对象互不干扰
二、clone关键字
在PHP中,用关键字clone来实现对象复制操作
举个栗子
1 <?php 2 class Foo{ 3 private $name; 4 5 private $age; 6 7 public function __construct(){ 8 $this->name="Tgier"; 9 10 $this->age="20"; 11 } 12 13 public function say(){ 14 echo "我是".$this->name.",我已经".$this->age."岁咯"; 15 } 16 } 17 18 $foo=new Foo(); 19 20 $cloneFoo=clone $foo; 21 22 $cloneFoo->say();
输出为
三、__clone()方法
显然,该方法也是PHP的一个魔术方法,系统会自动在复制对象成功后(如果对象中有__clone()方法的话)调用新对象的__clone()方法,可用于修改属性(如果想修改的话)
举个栗子
<?php class Foo{ private $name; private $age; public function __construct(){ $this->name="Tgier"; $this->age="20"; } public function __clone(){ echo "哈哈,我把".$this->name."复制啦。。。<br/>"; $this->name="<span style='font-size:25;'>假</span>Tiger"; } public function say(){ echo "我是".$this->name.",我已经".$this->age."岁咯<br/><br/>"; } } $foo=new Foo(); echo "真的:"; $foo->say(); echo "复制的:<br/>"; $cloneFoo=clone $foo; $cloneFoo->say();
输出为
小结:如果想在克隆后改变原对象的内容,需要在类中添加一个特殊的 __clone() 方法来重写原本的属性和方法。__clone() 方法只会在对象被克隆的时候自动调用。