zoukankan      html  css  js  c++  java
  • php面向对象之克隆对象

    在前面的PHP面向对象之对象和引用,我们试图以"$b=$a"的方式复制对象以传递对象的值(内容),结果却是传递对象的地址,在结尾为了解决复制对象这个问题,提到了克隆的方法。接下来讲一下php面向对象之克隆对象


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


    对象克隆

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

    01<?php
    02     class Person { 
    03          public $name
    04                                                                                                       
    05          function __construct($name="" ) {
    06               $this->name =$name;
    07                                                                                                                  
    08          }
    09          function say()  {    
    10               echo "我叫:"$this->name ."<br>" ;
    11          }
    12     }
    13     $Person=new Person( "张三"); 
    14     $Person1=clone $Person//使用clone关键字克隆(复制)对象,创建一个对象的副本
    15    // $Person1=$Person   //这不是复制对象,而是为对象多复制出一个访问该对象的引用
    16     $Person->say();                    
    17     $Person1->say();                    
    18                                                                                                          
    19?>

    上面程序运行结果为:

    我叫:张三

    我叫:张三

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


    1if($Person == $Person1){
    2       echo "Person和Person1具有相同的类和属性" ;
    3}else{
    4       return false;
    5}

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

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


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

    程序结果为false。


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

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

    1$Person=new Person( "张三"); 
    2     $Person1=clone $Person;                 
    3     $Person1-> name='李四' ;
    4     $Person->say();                    
    5     $Person1->say();

    程序运行结果为:

    我叫:张三

    我叫:李四


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


    __clone()方法

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

    01<?php
    02     class Person { 
    03          public $name
    04                             
    05          function __construct($name="" ) {
    06               $this->name =$name;
    07                                        
    08          }
    09          function __clone(){//在对象克隆时自动调用,用来为新对象重新赋值
    10             $this->name ='李四' ;
    11          }
    12          function say()  {    
    13               echo "我叫:"$this->name ."<br>" ;
    14          }
    15     }
    16     $Person=new Person( "张三");
    17     $Person1=clone $Person;                
    18     $Person->say();                   
    19     $Person1->say();                   
    20                                
    21?>

    程序运行结果为:

    我叫:张三

    我叫:李四

  • 相关阅读:
    jedis异常:Could not get a resource from the pool
    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resourc
    【redis】常见JedisConnectionException异常分析
    JAVA,字符串首字母转大写(高效率)
    Type handler was null on parameter mapping for property 'products'. It was either not specified and/or could not be found for the javaType / jdbcType combination specified
    java读取blob,clob转换为字符串
    mybatis对blob属性数据的处理
    mybatis读取oracle中blob
    jpa2.x的getOne()/findOne()/findById()的区别及使用
    IDEA如何导入导出出settings配置文件
  • 原文地址:https://www.cnblogs.com/zhouguowei/p/5179076.html
Copyright © 2011-2022 走看看