思考:对象只能通过实例化产生,而且即便是将对象复制给变量,得到的还是同一个对象,如果有的时候需要得到新的对象,除了实例化之外还有其他办法?
引入:对象理论上应该通过实例化来产生,这是对象产生的根本,但是有时候如果想在已有的对象上产生一个新的对象,可以通过克隆来实现。
对象克隆
定义:克隆对象clone,即通过已有的对象复制一个新的同样对象,但是两者之间并非用一个对象。
1.对象克隆是通过clone关键字实现,即clone 对象
<?php class student{ public $name; public $age=32; } //实例化 $s1=new student(); echo $s1->age; //输出32 //clone $s2= clone $s1; echo $s2->age; //返回32 echo '<hr>'; //新对象age属性重新赋值 $s2->age=77; echo $s1->age; //32 echo $s2->age; //77 并不是同一个对象。 ?>
2.对象在实例化的时候会自动调用存在的构造方法__construct(),同样的,在类的内部,php允许定义一个__clone的方法,在对象被克隆后,新克隆出来的对象会自动调用
<?php class student{ public $name; public $age=32; public function __clone(){ var_dump($this); $this->age++; } } $s1=new student(); $s2=clone $s1; echo $s2->age; //输出33 并且var_dump()也输出了 ?>
3.如果不允许对象被克隆,可以将__clone()方法私有化(本质四不允许对象在外部被克隆)
<?php class student{ public $name; public $age=32; //私有化,表示不允许该对象在外部克隆 private function __clone(){ } } ?>
总结:
1.对象可以通过克隆来得到新的对象(以前只能实例化)
2.克隆出来的对象会自动调用类中对应的__clone()方法(如果有该方法的话)
3.可以通过私有化来实现禁止外部对象克隆