zoukankan      html  css  js  c++  java
  • 简析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() 方法只会在对象被克隆的时候自动调用。

  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/TigerYangWTH/p/5908005.html
Copyright © 2011-2022 走看看