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() 方法可以当作新对象的构造函数,对新对象做一些初始的修改

  • 相关阅读:
    关闭编辑easyui datagrid table
    sql 保留两位小数+四舍五入
    easyui DataGrid 工具类之 util js
    easyui DataGrid 工具类之 后台生成列
    easyui DataGrid 工具类之 WorkbookUtil class
    easyui DataGrid 工具类之 TableUtil class
    easyui DataGrid 工具类之 Utils class
    easyui DataGrid 工具类之 列属性class
    oracle 卸载
    “云时代架构”经典文章阅读感想七
  • 原文地址:https://www.cnblogs.com/jiechn/p/4653715.html
Copyright © 2011-2022 走看看