[toc]
## 举个例子
> 《闪电侠》里面一个反派叫 Danton Black 的超级人类,拥有复制自身的超能力,能够变身出六个自己
> 程序员就需要这种能力,一个写UI, 一个写前端, 一个写APP, 一个建数据库, 一个写后台, 一个维护服务器...
## 代码示例
```php
<?php
// 人
class Person {
private $name;
private $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
public function showMyself() {
echo "我是{$this->name}, 年龄{$this->age}" . PHP_EOL;
}
public function coding() {
echo "我是一个码农, 我在用双手改变世界以及我的发际线..." . PHP_EOL;
}
public function reading() {
echo "阅读是我快乐, 我爱阅读胜过爱左手..." . PHP_EOL;
}
public function fallInLove() {
echo "神鬼狐仙, 风月无边...";
}
public function copy() {
return clone($this);
}
}
// 代码测试
$tony = new Person("Tony", 26);
$tony->showMyself();
$tony->coding();
$tony1 = $tony->copy();
$tony1->showMyself();
$tony1->reading();
$tony2 = $tony->copy();
$tony2->showMyself();
$tony2->fallInLove();
```
```
D:\soft\php72\php.exe D:\project\php_dp\index.php
我是Tony, 年龄26
我是一个码农, 我在用双手改变世界以及我的发际线...
我是Tony, 年龄26
阅读是我快乐, 我爱阅读胜过爱左手...
我是Tony, 年龄26
神鬼狐仙, 风月无边...
Process finished with exit code 0
```
## 什么是克隆模式?
> 通过拷贝自身的属性来创建一个新对象的过程叫做克隆模式。
> 克隆模式的核心就是一个 Clone 方法,Clone 方法的功能就是拷贝父本的所有属性
> 分配一块新的内存空间给新的对象; 拷贝父本对象的所有属性。
> 深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个
> 浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个
> PHP中, = 赋值时,普通对象是深拷贝,但对对象来说,是浅拷贝。也就是说,对象的赋值是引用赋值。
> php5中,对象的` = `赋值和传递都是引用。要想实现拷贝副本,php提供了`clone`函数实现。
![](https://box.kancloud.cn/b2634e21f7b00d8bf4cffe0610c08e64_322x284.png)
## 优缺点
**克隆模式的优点**
1.克隆模式是通过内存拷贝的方式进行复制,比 new 的方式创建对象性能更好;
1.通过深拷贝的方式,可以方便地创建一个具有相同属性和行为的另一个对象,特别是对于复杂对象,方便性尤为体现。
**克隆模式的缺点**
1. 通过克隆的方式创建对象,不会执行类的构造函数,这不一定是缺点,但大家使用的时候需要注意这一点。
## 应用场景
1. 如果创建新对象(如复杂对象)成本较大,我们可以利用已有的对象进行复制来获得。
1. 当类的初始化需要消耗非常多的资源时,如需要消耗很多的数据、硬件等资源。