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?>

    程序运行结果为:

    我叫:张三

    我叫:李四

  • 相关阅读:
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    449. Serialize and Deserialize BST
    114. Flatten Binary Tree to Linked List
    199. Binary Tree Right Side View
    173. Binary Search Tree Iterator
    98. Validate Binary Search Tree
    965. Univalued Binary Tree
    589. N-ary Tree Preorder Traversal
    eclipse设置总结
  • 原文地址:https://www.cnblogs.com/zhouguowei/p/5179076.html
Copyright © 2011-2022 走看看