PHP设计模式(2)-原型模式
2013-01-19 23:39
471 查看
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。它从一个对象再创建另外一个可以定制的对象,而且不需要知道任何创建的细节。
注意:clone只会给应用的对象生成一个浅复制,产品对象会和源对象有一样的属性。如果源对象的属性是对象,那么这些对象的属性不会被直接复制到产品中,而是产品会引用同样的对象属性。要实现深复制,就需要使用__clone(),来定制复制。
关于clone():
对于一般的对象克隆,没有什么的了,但是如果克隆的对象属性中有引用类成员(&)或者属性是对个对象的话,一个对象属性的改变会影响到另外一个对象属性。
例如下面的例子(浅复制):
下面的例子是深复制:
<?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;
相关文章推荐
- PHP设计模式:创建型之原型模式(Prototype)
- php设计模式 原型模式
- php实现设计模式之 原型模式
- PHP设计模式——原型模式
- PHP设计模式 原型设计模式
- php设计模式之原型模式
- php设计模式 Prototype (原型模式)
- PHP设计模式 原型模式(Prototype)
- PHP设计模式(六)原型模式(Prototype For PHP)
- PHP设计模式之原型模式详解
- 慕课网----大话PHP设计模式 五(原型模式,装饰器模式,迭代器模式,代理模式)
- PHP设计模式之原型设计模式原理与用法分析
- php设计模式之——原型模式
- PHP设计模式——原型模式
- PHP设计模式三:原型设计模式
- [转载]PHP设计模式之:原型模式
- 学习php设计模式 php实现原型模式(prototype)
- PHP设计模式:原型模式
- php设计模式 Prototype (原型模式)代码