原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。它从一个对象再创建另外一个可以定制的对象,而且不需要知道任何创建的细节。

  1. <?php 
  2. /**********原型模式******/ 
  3. header("Content-type: text/html; charset=utf-8");  
  4. class Resume{ 
  5.     private $name
  6.     private $sex
  7.     private $age
  8.     private $timeArea
  9.     private $company
  10.     function __construct($name){ 
  11.         $this->name=$name
  12.     } 
  13.     function SetPersonalInfo($sex,$age){ 
  14.         $this->sex=$sex
  15.         $this->age=$age
  16.     } 
  17.     function SetWorkExperience($timeArea,$company){ 
  18.         $this->timeArea=$timeArea
  19.         $this->company=$company
  20.     } 
  21.     function display(){ 
  22.         echo "姓名".$this->name."<br>"
  23.         echo "性别".$this->sex."<br>"
  24.         echo "年龄".$this->age."<br>"
  25.         echo "工作地点".$this->timeArea."<br>"
  26.         echo "公司".$this->company."<br>"
  27.     } 
  28.     function copy(){ 
  29.         return clone $this
  30.     } 
  31.  
  32. $Resume_a=new Resume("大鸟"); 
  33. $Resume_a->SetPersonalInfo("男",29); 
  34. $Resume_a->SetWorkExperience("1998-2000","XX公司"); 
  35.  
  36. $Resume_b=$Resume_a->copy(); 
  37. $Resume_b->SetWorkExperience("2000-2006","YY公司"); 
  38.  
  39.  
  40. $Resume_a->display(); 
  41. echo "**********<br>"
  42. $Resume_b->display(); 
  43. echo "**********<br>"

 注意:clone只会给应用的对象生成一个浅复制,产品对象会和源对象有一样的属性。如果源对象的属性是对象,那么这些对象的属性不会被直接复制到产品中,而是产品会引用同样的对象属性。要实现深复制,就需要使用__clone(),来定制复制。

关于clone():

对于一般的对象克隆,没有什么的了,但是如果克隆的对象属性中有引用类成员(&)或者属性是对个对象的话,一个对象属性的改变会影响到另外一个对象属性。

例如下面的例子(浅复制):

 

  1. <?php 
  2. class a{ 
  3.     public $s = ''
  4. class b{ 
  5.     public $a = null; 
  6.     public $str = null; 
  7. $str = 'this is $str'
  8. $b_1 = new b(); 
  9. $b_1->a = new a(); 
  10. $b_1->str = & $str
  11.  
  12. $b_1->a->s = 'this is b1 a s'
  13. $b_2 = clone $b_1
  14. $b_2->a->s = 'this is b2 a s'
  15. $b_2->str = 'this is b2 $str'
  16. echo $b_1->a->s; 
  17. echo "<br>*********<br>"
  18. echo $b_1->str; 
  19. echo "<br>*********<br>"
  20. echo $b_2->a->s; 
  21. echo "<br>*********<br>"
  22. echo $b_2->str; 

下面的例子是深复制:

 

  1. <?php 
  2. class a{ 
  3.     public $s = ''
  4. class b{ 
  5.     public $a = null; 
  6.     public $str = null; 
  7.     public function __clone(){ 
  8.         $b = $this->str; 
  9.         $this->str = & $b
  10.         $this->a = clone($this->a); 
  11.     } 
  12.  
  13. $str = '123'
  14. $b_1 = new b(); 
  15. $b_1->a = new a(); 
  16. $b_1->str = & $str
  17.  
  18. $b_1->a->s = 'b1'
  19. $b_2 = clone $b_1
  20. $b_2->a->s = 'aaaaa'
  21. $b_2->str = 'nihao'
  22. echo $b_1->a->s; 
  23. echo "<br>*********<br>"
  24. echo $b_1->str; 
  25. echo "<br>*********<br>"
  26. echo $b_2->a->s; 
  27. echo "<br>*********<br>"
  28. echo $b_2->str;