对象复制与浅复制

<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>
原文地址:https://www.cnblogs.com/-beyond/p/5695454.html