Object之克隆对象clone 和__clone()函数

  在前面的PHP面向对象之对象和引用,"$b=$a"的方式复制对象传递的是对象的地址,而不是传递对象的值(内容),我们可以通过克隆对象来实现对对象的内容和引用的复制

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

 总结: __clone() 方法可以当作新对象的构造函数,对新对象做一些初始的修改

原文地址:https://www.cnblogs.com/jiechn/p/4653715.html