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

posted on 2016-09-26 09:40  Yang24556  阅读(343)  评论(0编辑  收藏  举报

导航