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

程序运行结果为:

我叫:张三

我叫:李四

原文地址:https://www.cnblogs.com/zhouguowei/p/5179076.html