在前面的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() 方法可以当作新对象的构造函数,对新对象做一些初始的修改
时间: 2024-10-08 03:11:39