php面向对象之克隆对象
在前面的PHP面向对象之对象和引用,我们试图以"$b=$a"的方式复制对象以传递对象的值(内容),结果却是传递对象的地址,在结尾为了解决复制对象这个问题,提到了克隆的方法。接下来讲一下php面向对象之克隆对象。
前面我们已经知道,使用传址引用的方式调用对象,实质调用的是同一个对象,有时需要建设立一个对象的副本,改变原来的对象时不希望影响到副本,在PHP中可以根据现在的对象来克隆出一个完全一样的对象,克隆出来的副本和原本两个对象完全独立而互不干扰。
对象克隆
在php中使用"clone"关键字来克隆对象。
| 01 | <?php | 
| 02 |      classPerson {  | 
| 03 |           public$name;  | 
| 04 |                                                                                                        | 
| 05 |           function__construct($name="") { | 
| 06 |                $this->name =$name; | 
| 07 |                                                                                                                   | 
| 08 |           } | 
| 09 |           functionsay()  {     | 
| 10 |                echo"我叫:". $this->name ."<br>"; | 
| 11 |           } | 
| 12 |      } | 
| 13 |      $Person=newPerson( "张三");  | 
| 14 |      $Person1=clone $Person; //使用clone关键字克隆(复制)对象,创建一个对象的副本 | 
| 15 |     // $Person1=$Person   //这不是复制对象,而是为对象多复制出一个访问该对象的引用 | 
| 16 |      $Person->say();                     | 
| 17 |      $Person1->say();                     | 
| 18 |                                                                                                           | 
| 19 | ?> | 
上面程序运行结果为:
我叫:张三
我叫:张三
克隆的副本和原本拥有相同的类和属性
| 1 | if($Person== $Person1){ | 
| 2 |        echo"Person和Person1具有相同的类和属性"; | 
| 3 | }else{ | 
| 4 |        returnfalse; | 
| 5 | } | 
程序输出:Person和Person1具有相同的类和属性
克隆的副本和原本存储在不相同的位置
| 1 | if($Person=== $Person1){ | 
| 2 |        echo"Person和Person1具有相同的类和属性且存储在相同的位置"; | 
| 3 | } else{ | 
| 4 |        returnfalse ; | 
| 5 | } | 
程序结果为false。
克隆的副本和原本独立而互不干扰
我们来改变一下原本的属性值,看一下有什么影响
| 1 | $Person=newPerson( "张三");  | 
| 2 |      $Person1=clone $Person;                  | 
| 3 |      $Person1-> name='李四'; | 
| 4 |      $Person->say();                     | 
| 5 |      $Person1->say(); | 
程序运行结果为:
我叫:张三
我叫:李四
由此可知,克隆出来的副本和原本两个对象完全独立而互不干扰。
__clone()方法
如果需要为克隆后的副本对象克隆时重新为成员属性赋值,可以在类中声明一个魔术方法"__clone"
| 01 | <?php | 
| 02 |      classPerson {  | 
| 03 |           public$name;  | 
| 04 |                              | 
| 05 |           function__construct($name="") { | 
| 06 |                $this->name =$name; | 
| 07 |                                         | 
| 08 |           } | 
| 09 |           function__clone(){//在对象克隆时自动调用,用来为新对象重新赋值 | 
| 10 |              $this->name ='李四'; | 
| 11 |           } | 
| 12 |           functionsay()  {     | 
| 13 |                echo"我叫:". $this->name ."<br>"; | 
| 14 |           } | 
| 15 |      } | 
| 16 |      $Person=newPerson( "张三"); | 
| 17 |      $Person1=clone $Person;                 | 
| 18 |      $Person->say();                    | 
| 19 |      $Person1->say();                    | 
| 20 |                                 | 
| 21 | ?> | 
程序运行结果为:
我叫:张三
我叫:李四
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号