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

  • 相关阅读:
    Appium+python自动化27-等待activity出现(android特有的wait_activity)
    Appium+python自动化26-模拟手势点击坐标(tap)
    Appium+python自动化25-windows版appium_desktop_V1.7.1
    Appium+python自动化24-滑动方法封装(swipe)
    Appium+python自动化23-Appium Desktop
    Appium+python自动化22-DesiredCapabilities详解
    Appium+python自动化20-iOS模拟器(iOS Simulator)安装自家APP
    Appium+python自动化21-查看iOS上app元素属性
    pip3安装pymsql出现的No matching distribution found for pymysql 解决办法
    树莓派升级Python至3.6
  • 原文地址:https://www.cnblogs.com/TigerYangWTH/p/5908005.html
Copyright © 2020-2023  润新知