<html> <head> <meta charset="utf-8"> <title>对象复制与克隆</title> </head> <body> <!-- 代码1 --> <?php $a=15; echo $a."<br>";//输出15 $b=$a; echo $b."<br>";//输出15 $b=25; echo $b."<br>";//输出25 echo $a."<br>";//输出15 //可以发现,普通变量是值传递,在不同的内存空间,其中一个改变对于另一个没有影响 ?> <!-- 代码2 --> <?php class Student{ private $name; private $age; public function setName($name){ $this->name=$name; return $this; } public function setAge($age){ $this->age=$age; return $this; } public function getName(){ return $this->name; } public function getAge(){ return $this->age; } } $stu_1=new Student(); $stu_1->setName('jake')->setAge(20); echo $stu_1->getName()." ".$stu_1->getAge();//输出jake 20 $stu_2=$stu_1;//建立一个对象并赋值 echo $stu_2->getName()." ".$stu_2->getAge();//输出jake 20 $stu_2->setName('peter')->setAge(18); echo $stu_2->getName()." ".$stu_2->getAge();//输出peter 18 echo $stu_1->getName()." ".$stu_1->getAge();//输出peter 18 //可以发现类在赋值时,共用的是一段内存,其中一个改变,另外一个也同时改变,相当于起了一个别名 ?> <!-- 代码3 --> <?php class Student{ private $name; private $age; public function setName($name){ $this->name=$name; return $this; } public function setAge($age){ $this->age=$age; return $this; } public function getName(){ return $this->name; } public function getAge(){ return $this->age; } } $stu_1=new Student(); $stu_1->setName('jake')->setAge(20); echo $stu_1->getName()." ".$stu_1->getAge();//输出jake 20 $stu_2=clone $stu_1;//建立一个对象并赋值 echo $stu_2->getName()." ".$stu_1->getAge();//输出jake 20 $stu_2->setName('peter')->setAge(18); echo $stu_2->getName()." ".$stu_2->getAge();//输出peter 18 echo $stu_1->getName()." ".$stu_1->getAge();//输出jake 20 //可以发现,经过clone复制后,两个对象的内存不是同一段,其中一个改变,不影响另外一个。 ?> <!-- 代码4 --> <?php class Student{ private $name; private $age; public function setName($name){ $this->name=$name; return $this; } public function setAge($age){ $this->age=$age; return $this; } public function getName(){ return $this->name; } public function getAge(){ return $this->age; } public function __clone(){//再上一个代码上面添加此函数 $this->age=""; } } $stu_1=new Student(); $stu_1->setName('jake')->setAge(20); echo $stu_1->getName()." ".$stu_1->getAge();//输出jake 20 $stu_2=clone $stu_1;//建立一个对象并赋值 echo $stu_2->getName()." ".$stu_2->getAge();//输出jake (age为空) $stu_2->setName('peter')->setAge(18); echo $stu_2->getName()." ".$stu_2->getAge();//输出peter 18 echo $stu_1->getName()." ".$stu_1->getAge();//输出jake 20 //__clone()函数是为了进行"浅复制",将一些不需要复制的内容在__clone中进行处理。 ?> </body> </html>