zoukankan      html  css  js  c++  java
  • Object之克隆对象clone 和__clone()函数

      在前面的PHP面向对象之对象和引用,"$b=$a"的方式复制对象传递的是对象的地址,而不是传递对象的值(内容),我们可以通过克隆对象来实现对对象的内容和引用的复制

      使用传址引用的方式调用对象,实质调用的是同一个对象,有时需要建设立一个对象的副本,改变原来的对象时不希望影响到副本,在PHP中可以根据现在的对象来克隆出一个完全一样的对象,克隆出来的副本和原本两个对象完全独立而互不干扰

    在php中使用"clone"关键字来克隆对象

    <?php
    class Person { 
          public $name; 
          function __construct($name="" ) {
                                     $this->name =$name;
          }
         function say()  {    
                       echo "我叫:". $this->name ."<br>" ;
          }
    }
    $Person=new Person( "张三"); 
     $Person1=clone $Person; //使用clone关键字克隆(复制)对象,创建一个对象的副本
    // $Person1=$Person   //这不是复制对象,而是为对象多复制出一个访问该对象的引用
     $Person->say();          //我叫:张三          
     $Person1->say();         //我叫:张三        
    ?>
     
    

      克隆的副本和原本拥有相同的类和属性

    if($Person == $Person1){    == 比较的是内容值
                 echo "Person和Person1具有相同的类和属性" ;
    }else{
         return false;
    
    }
    

      程序输出:Person和Person1具有相同的类和属性

    克隆的副本和原本存储在不相同的位置

    if ($Person === $Person1){
          echo "Person和Person1具有相同的类和属性且存储在相同的位置" ;
    } else{
                return false ;
    }
        
    

    程序结果为false。

    克隆的副本和原本独立而互不干扰

    我们来改变一下原本的属性值,看一下有什么影响

    $Person=new Person( "张三"); 
    $Person1=clone $Person;                 
    $Person1-> name='李四' ;
    $Person->say();         我叫:张三           
    $Person1->say();        我叫:李四
    

      由此可知,克隆出来的副本和原本两个对象完全独立而互不干扰。

    __clone()方法

    如果需要为克隆后的副本对象克隆时重新为成员属性赋值,可以在类中声明一个魔术方法"__clone"

    <?php
    class Person { 
           public $name; 
           function __construct($name="" ) {
                            $this->name =$name;
            }
           function __clone(){//在对象克隆时自动调用,用来为新对象重新赋值
                 $this->name ='李四' ;
            }
            function say()  {    
                     echo "我叫:". $this->name ."<br>" ;
            }
    }
    $Person=new Person( "张三");
     $Person1=clone $Person;                
    $Person->say();                   
     $Person1->say();                   
    ?>
    

     总结: __clone() 方法可以当作新对象的构造函数,对新对象做一些初始的修改

  • 相关阅读:
    动态数组arraylist的使用
    第一次
    layui.mobile.css
    index.html
    Ansible部署配置
    微服务项目配置文件
    镜像挂载
    网卡设置
    获取内存信息
    超时方法
  • 原文地址:https://www.cnblogs.com/jiechn/p/4653715.html
Copyright © 2011-2022 走看看