php与设计模式-原型模式

原型模式

通过复制已经存在的对象来创建新对象
有的时候创建一个对象有很多步骤才算是完成一个完整的创建过程,我要再创建一个的话,还得从头开始,不如复制,使用原型模式实现

Demo:

interface Potrotype{
   public function copy();
}

//通过在原型类中加一个copy方法,使得这个原型类的实例可以被复制
class Demo implements Potrotype{
   private $state;

   public function setState($state){
       $this->state = $state;
   }

   public function getState(){
       return $this->state;
   }

public function copy(){
   //浅拷贝   指针拷贝是浅拷贝
       return clone $this;

/ *
* 深拷贝   值拷贝是深拷贝
*/
//      $tmp = serialize($this);
//      $tmp = unserialize($tmp);
//      return $tmp;
   }
}

class Client{
   public static function main(){
       $obj1 = new Demo();
       $obj1->setState(23);
       $obj2 = $obj1->copy();
       $res = $obj2->getState();
       echo $res;
   }
}
Client::main();

php clone 方法是浅拷贝(针对被拷贝对象内的属性成员是引用类型的,则拷贝后对象的该属性仍是引用类型,没有复制出一份新的)

浅拷贝
class myClass{
   public $data;
}
$sss ="aaa";
$obj1 = new myClass();
$obj1->data =&$sss;   //注意,这里是个引用!
$obj2 = clone $obj1;
$obj2->data="bbb";  //这时,$obj1->data的值变成了"bbb" 而不是"aaa"!
var_dump($obj1);//bbb
var_dump($obj2);//bbb

深拷贝
class myClass{
   public $data;
   function copy(){
       $tmp = serialize($this);
       $tmp = unserialize($tmp);
       return $tmp;
   }
}
$sss ="aaa";
$obj1 = new myClass();
$obj1->data =&$sss;   //注意,这里是个引用!
$obj2 = $obj1->copy();
$obj2->data="bbb";  //这时,$obj1->data的值变成了"bbb" 而不是"aaa"!
var_dump($obj1);//aaa
var_dump($obj2);//bbb

大学学习c语言时,提到过这两个的区别。我依稀记得是 值拷贝是深拷贝,而指针拷贝是浅拷贝。
浅复制呢又称为浅拷贝,深复制又称为深拷贝。
浅复制的话,就是通过一个原型实例(这里暂称为老对象)克隆所得到的对象(这里暂时称为新对象),
而这个新对象中所有的值类型变量都含有与老对象相同的值,
但是,新对象所有的对其他对象的引用却是和老对象指向同一个地方,
即对引用类型来说,老对象和新对象指向同一个引用对象。
深复制呢,和浅复制就一点不同,那就是,
新对象所有的对其他对象的引用都是指向了复制过的对象,而不再是和老对象指向同一个对象。

请关注我的订阅号

订阅号.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值