介绍
本篇内容介绍了PHP中”的工厂模式和原型模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
上代码
& lt; PHP ? {interface 原型 public function  shallowCopy (); public function  deepCopy (); } {class ConcretePrototype  implements 原型 private _name美元; public function  __construct(美元名称){=$ this→_name 美元名称; } public function  setName(美元名称){=$ this→_name 美元名称; } public function  shallowCopy () {//在php语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现克隆()方法是其中最简单,也是最高效的手段。//如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用,,可用于修改属性的值//你要先对新象才能克隆,一个是实例化,一个是克?/对象的复制是通过关键字,clone 来实现的。用,clone 克隆出来的对象与原对象没有任何关系,它是把原来的对象从当前的位置重新复制了一份,也就是相当于在内存中新开辟了一块空间 return clone 美元; } public function  deepCopy () {//序列化深拷贝:利用序列化来做深拷贝,把对象写到流里的过程是序列化的过程,这一过程称为“冷冻”或“腌咸菜”,反序列化对象的过程叫做“解冻”或“回鲜”。这种深复制比较简单//当数组值包含如双引号,单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。//但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用只//base64_encode (gzcompress(序列化(obj美元)));序列化//unserialize (gzuncompress (base64_decode (txt)美元));反序列化 $ serialize_obj =,序列化($); $ clone_obj =, unserialize ($ serialize_obj); return clone_obj美元; } public function  getName () { return 这→美元_name; } }//上面的原型基本上就写完的了 {class 演示 public 美元字符串; } class UsePrototype { public function 浅(){ $ demo =, new 演示(); 时间=美元演示→string “susan";//新建 $ object_shallow_first =, new ConcretePrototype($演示);//浅复制 美元$ object_shallow_second =, object_shallow_first→shallowCopy ();//之下代码可以删除 echo & # 39;新对象:& lt; br/祝辞& # 39;; var_dump()美元object_shallow_first→getName ()); ,,,,,,,echo & # 39;浅复制的对象& lt; br/祝辞& # 39;; ,,,,,,,var_dump()美元object_shallow_second→getName ()); ,,,,,,,echo & # 39; & lt; br/祝辞& # 39;; ,,,,,,,时间=美元演示→string “jack"; ,,,,,,, ,,,,,,,echo & # 39;我改变新建的对象属性:& lt; br/祝辞& # 39;; ,,,,,,,var_dump()美元object_shallow_first→getName ()); ,,,,,,,echo & # 39;浅复制是同一块内存,受影响& lt; br/祝辞& # 39;; ,,,,,,,var_dump()美元object_shallow_second→getName ()); ,,,,,,,echo & # 39; & lt; br/祝辞& # 39;; } public function 深(){//新建对象,构造函数没参数就不用带括号 $ demo =, new 演示; 时间=美元演示→string “Siri";//新建 $ object_shallow_first =, new ConcretePrototype($演示);//浅复制 美元$ object_shallow_second =, object_shallow_first→deepCopy ();//之下代码可以删除 echo & # 39;新对象:& lt; br/祝辞& # 39;; var_dump()美元object_shallow_first→getName ()); ,,,,,,,echo & # 39;深复制的对象& lt; br/祝辞& # 39;; ,,,,,,,var_dump()美元object_shallow_second→getName ()); ,,,,,,,echo & # 39; & lt; br/祝辞& # 39;; ,,,,,,,时间=美元演示→string “jack"; ,,,,,,, ,,,,,,,echo & # 39;我改变新建的对象属性:& lt; br/祝辞& # 39;; ,,,,,,,var_dump()美元object_shallow_first→getName ()); ,,,,,,,echo & # 39;深复制是完全新的对象,不受影响& lt; br/祝辞& # 39;; ,,,,,,,var_dump()美元object_shallow_second→getName ()); ,,,,,,,echo & # 39; & lt; br/祝辞& # 39;; } }//调用 $ up =, new UsePrototype; 美元上涨→浅(); echo & # 39; & lt; hr> & # 39;; 美元上涨→深();//原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是用对象内部提供的克隆方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂方法模式与抽象工厂都是通过工厂封装具体的,new 操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景,可能使用原型模式更简单,效率更高://如果说我们的对象类型不是刚开始就能确定,而是在运行时确定的话,那么我们通过这个类型的对象克隆出一个新的类型更容易。//有的时候我们可能在实际的项目中需要一个对象在某个状态下的副本,这个前提很重要,这点怎么理解呢,例如有的时候我们需要对比一个对象经过处理后的状态和处理前的状态是否发生过改变,可能我们就需要在执行某段处理之前,克隆这个对象此时状态的副本,然后等执行后的状态进行相应的对比,这样的应用在项目中也是经常会出现的。//当我们处理的对象比较简单,并且对象之间的区别很小,可能只是很固定的几个属性不同的时候,使用原型模式更合适。 ?在PHP中的工厂模式和原型模式怎么实现