专注于WEB技术的IT博客

php面向对象之克隆对象

时间:2013-04-22分类: php浏览:6532
分享到:

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


前面我们已经知道,使用传址引用的方式调用对象,实质调用的是同一个对象,有时需要建设立一个对象的副本,改变原来的对象时不希望影响到副本,在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();                   
                               
?>

程序运行结果为:

我叫:张三

我叫:李四




猜你喜欢
php面向对象之__autoload()
php面向对象之__call处理错误调用
php面向对象之__toString()
PHP面向对象之const常量修饰符
php面向对象之final的应用
PHP面向对象之对象和引用
php面向对象之类的静态成员
php面向对象之子类中重载父类的方法
php面向对象的访问类型控制
php面向对象编程之类的继承性
标签 : php 面向对象
除非注明,本文首发网志博客,欢迎转载!转载请注明本文地址:http://w3note.com/web/104.html,谢谢。
  • 评论
  • 赞助本站