首页 > 代码库 > 简析clone关键字与__clone()方法

简析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() 方法只会在对象被克隆的时候自动调用。

简析clone关键字与__clone()方法