对象克隆
在php中使用"clone"关键字来克隆对象。
class Person {
public $name;
function __construct($name="" ) {
$this->name =$name;
}
function say() {
echo "我叫:". $this->name ."
" ;
}
}
$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"
class Person {
public $name;
function __construct($name="" ) {
$this->name =$name;
}
function __clone(){//在对象克隆时自动调用,用来为新对象重新赋值
$this->name ='李四' ;
}
function say() {
echo "我叫:". $this->name ."
" ;
}
}
$Person=new Person( "张三");
$Person1=clone $Person;
$Person->say();
$Person1->say();
?>
程序运行结果为:
我叫:张三
我叫:李四