原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。它从一个对象再创建另外一个可以定制的对象,而且不需要知道任何创建的细节。
- <?php
- /**********原型模式******/
- header("Content-type: text/html; charset=utf-8");
- class Resume{
- private $name;
- private $sex;
- private $age;
- private $timeArea;
- private $company;
- function __construct($name){
- $this->name=$name;
- }
- function SetPersonalInfo($sex,$age){
- $this->sex=$sex;
- $this->age=$age;
- }
- function SetWorkExperience($timeArea,$company){
- $this->timeArea=$timeArea;
- $this->company=$company;
- }
- function display(){
- echo "姓名".$this->name."<br>";
- echo "性别".$this->sex."<br>";
- echo "年龄".$this->age."<br>";
- echo "工作地点".$this->timeArea."<br>";
- echo "公司".$this->company."<br>";
- }
- function copy(){
- return clone $this;
- }
- }
- $Resume_a=new Resume("大鸟");
- $Resume_a->SetPersonalInfo("男",29);
- $Resume_a->SetWorkExperience("1998-2000","XX公司");
- $Resume_b=$Resume_a->copy();
- $Resume_b->SetWorkExperience("2000-2006","YY公司");
- $Resume_a->display();
- echo "**********<br>";
- $Resume_b->display();
- echo "**********<br>";
注意:clone只会给应用的对象生成一个浅复制,产品对象会和源对象有一样的属性。如果源对象的属性是对象,那么这些对象的属性不会被直接复制到产品中,而是产品会引用同样的对象属性。要实现深复制,就需要使用__clone(),来定制复制。
关于clone():
对于一般的对象克隆,没有什么的了,但是如果克隆的对象属性中有引用类成员(&)或者属性是对个对象的话,一个对象属性的改变会影响到另外一个对象属性。
例如下面的例子(浅复制):
- <?php
- class a{
- public $s = '';
- }
- class b{
- public $a = null;
- public $str = null;
- }
- $str = 'this is $str';
- $b_1 = new b();
- $b_1->a = new a();
- $b_1->str = & $str;
- $b_1->a->s = 'this is b1 a s';
- $b_2 = clone $b_1;
- $b_2->a->s = 'this is b2 a s';
- $b_2->str = 'this is b2 $str';
- echo $b_1->a->s;
- echo "<br>*********<br>";
- echo $b_1->str;
- echo "<br>*********<br>";
- echo $b_2->a->s;
- echo "<br>*********<br>";
- echo $b_2->str;
下面的例子是深复制:
- <?php
- class a{
- public $s = '';
- }
- class b{
- public $a = null;
- public $str = null;
- public function __clone(){
- $b = $this->str;
- $this->str = & $b;
- $this->a = clone($this->a);
- }
- }
- $str = '123';
- $b_1 = new b();
- $b_1->a = new a();
- $b_1->str = & $str;
- $b_1->a->s = 'b1';
- $b_2 = clone $b_1;
- $b_2->a->s = 'aaaaa';
- $b_2->str = 'nihao';
- echo $b_1->a->s;
- echo "<br>*********<br>";
- echo $b_1->str;
- echo "<br>*********<br>";
- echo $b_2->a->s;
- echo "<br>*********<br>";
- echo $b_2->str;