糜湾嫁舵氨率柿日岛熟慷碾庆
对象的复制与克隆
1.默认情况下,对象是引用传递(实际上是对象标识符的复制,后面会详细说)
2.也就是说二个对象变量实际上是引用的是同一个对象
3.如果要创建一个新的对象,必须使用clone关键字来克隆当前对象
4.当使用clone关键字时,如果类中有__clone()会自动调用
5.__clone()方法运行在新创建的对象上面
6.__clone()方法能控制我们复制什么,以及克隆时要完成的基本操作
新建demo5.php
<?php //声明会员类:Member class Member { //声明三个私有属性 private $name;//会员名 private $email;//会员邮箱 private $score;//会员积分 //构造方法 public function __construct($name="",$email="",$score=0) { $this->name=$name; $this->email=$email; $this->score=$score; } //查询器 public function __get($name) { return $this->$name; } //设置器 public function __set($name, $value) { $this->$name=$value; } } //实例化会员类 $member=new Member('mengmianren','mengmianren@123.com',1000); echo $member->score."<hr>"; //复制会员对象 $member1=$member; echo $member1->score."<hr>"; $member1->score=2000; echo $member1->score."<hr>"; echo $member->score."<hr>"; var_dump($member); echo "<hr>"; var_dump($member);
执行,可知复制的对象仍然是原来的对象,即复制对象并没有创建新的队形。
结论:
1.新变量修改的结果反映到了原对象变量中
2.说明这二个变量,实际上指向的是同一个对象
3.也就是对象默认是引用传递
4.或者说,第二个变量名$member1只是原变量的别名,并没创建新对象
5.可以理解为仅仅是将原对象的标识符,重新起了一个新名称罢了
克隆创建新对象:
<?php //声明会员类:Member class Member { //声明三个私有属性 private $name;//会员名 private $email;//会员邮箱 private $score;//会员积分 //构造方法 public function __construct($name="",$email="",$score=0) { $this->name=$name; $this->email=$email; $this->score=$score; } //查询器 public function __get($name) { return $this->$name; } //设置器 public function __set($name, $value) { $this->$name=$value; } } //实例化会员类 $member=new Member('mengmianren','mengmianren@123.com',1000); $member2= clone $member; var_dump($member); echo "<hr>"; var_dump($member2); echo "<hr>"; echo $member2->score."<hr>"; $member2->score=5000; echo $member2->score."<hr>"; echo $member->score."<hr>";
执行,通过克隆成功创建了新对象
__clone()克隆魔术方法在对象克隆时自动调用,针对新对象进行初始化操作
<?php //声明会员类:Member class Member { //声明三个私有属性 private $name;//会员名 private $email;//会员邮箱 private $score;//会员积分 //构造方法 public function __construct($name="",$email="",$score=0) { $this->name=$name; $this->email=$email; $this->score=$score; } //查询器 public function __get($name) { return $this->$name; } //设置器 public function __set($name, $value) { $this->$name=$value; } //克隆魔术方法在对象克隆时自动调用,针对新对象进行初始化操作 //即:克隆一个新的会员时,它的姓名邮箱保留,但是积分清零 public function __clone() { $this->score=0; } } //实例化会员类 $member=new Member('mengmianren','mengmianren@123.com',1000); $member2= clone $member; echo $member2->score."<hr>";
执行:
漂溯隋腺科痹绘弯蘑殊锤譬戚