php5对象复制、clone、浅复制与深复制实例详解(2)

用clone(克隆)来复制对象

我们现在使用PHP5的clone语言结构来复制对象,代码如下:

PHP代码

$tv1 = new Television();
$tv2 = clone $tv1;
echo 'color of tv1 is: ' . $tv1->getColor();//tv1的颜色是black
echo '<br>';
echo 'color of tv2 is: ' . $tv2->getColor();//tv2的颜色是black
echo '<br>';
//把tv2换成涂成白色
$tv2->setColor('white');
echo 'color of tv2 is: ' . $tv2->getColor();//tv2的颜色是white
echo '<br>';
echo 'color of tv1 is: ' . $tv1->getColor();//tv1的颜色是black

这段代码的第2行,我们用clone关键字复制tv1,现在我们就拥有了一份真正的tv1的拷贝tv2,我们还是按照之前的方法来检测复制是否成功。我们可以看到,我们将tv2的颜色换成了white,tv1的颜色还是black,这样我们的复制操作就成功了。

__clone魔术方法

现在我们考虑到这样一个情况,每一台电视机应该都有自己的编号,这个编号如同我们的身份证号码一样应该是唯一的,所以当我们在复制一台电视机的时候,我们不希望这个编号也被复制过来,以免造成一些麻烦。我们想到的一个策略是将赋值出来的电视机的编号清空,然后再按照需求来重新分配编号。

那么__clone魔术方法就是专门用来解决这样的问题,__clone魔术方法会在对象被复制( 也就是clone操作)的时候被触发。我们修改了电视机类Television的代码,添加了编号属性和__clone方法,代码如下。

PHP代码

/**
电视机类
*/
class Television
{
  /**
   电视机编号
   */
  protected $_identity  = 0;
  /**
   屏幕高度
   */
  protected $_screenLength = 300;
  /**
   屏幕宽度
   */
  protected $_screenHight = 200;
  /**
   电视机外观颜色
   */
  protected $_color    = 'black';
  /**
   返回电视外观颜色
   */
  public function getColor()
  {
    return $this->_color;
  }
  /**
   设置电视机外观颜色
   */
  public function setColor($color)
  {
    $this->_color = (string)$color;
    return $this;
  }
  /**
   返回电视机编号
   */
  public function getIdentity()
  {
    return $this->_identity;
  }
  /**
   设置电视机编号
   */
  public function setIdentity($id)
  {
    $this->_identity = (int)$id;
    return $this;
  }
  public function __clone()
  {
    $this->setIdentity(0);
  }
}

下面我们来复制这样的一个电视机对象。

PHP代码

$tv1 = new Television();
$tv1->setIdentity('111111');
echo 'id of tv1 is ' . $tv1->getIdentity();//111111
echo '<br>';
$tv2 = clone $tv1;
echo 'id of tv2 is ' . $tv2->getIdentity();//0

我们生产了一台电视机tv1 , 并且设置它的编号为111111,然后我们用clone将tv1复制得到了tv2,这个时候__clone魔术方法被触发,此方法将直接作用与复制得到的对象tv2,我们在__clone方法中调用了setIdentity成员方法将tv2的_identity属性清空,以便我们后面对它进行重新编号。由此我们可以看到__clone魔术方法能让我们非常方便的在clone对象的时候做一些附加的操作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/4991.html