重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇内容介绍了“PHP中的工厂模式和原型模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联是一家集网站建设,增城企业网站建设,增城品牌网站建设,网站定制,增城网站建设报价,网络营销,网络优化,增城网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。上代码
_name = $name; } public function setName($name){ $this->_name = $name; } public function shallowCopy(){ //在php语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。 //如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可用于修改属性的值 //你要先new对象才能clone,一个是实例化,一个是克隆 //对象的复制是通过关键字 clone 来实现的。用 clone 克隆出来的对象与原对象没有任何关系,它是把原来的对象从当前的位置重新复制了一份,也就是相当于在内存中新开辟了一块空间 return clone $this; } public function deepCopy(){ //序列化深拷贝:利用序列化来做深拷贝,把对象写到流里的过程是序列化的过程,这一过程称为“冷冻”或“腌咸菜”,反序列化对象的过程叫做“解冻”或“回鲜”。这种深复制比较简单 //当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。 //但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。 //base64_encode(gzcompress(serialize($obj)));序列化 //unserialize(gzuncompress(base64_decode($txt)));反序列化 $serialize_obj = serialize($this); $clone_obj = unserialize($serialize_obj); return $clone_obj; } public function getName(){ return $this->_name; } } //上面的原型基本上就写完了 class Demo{ public $string; } class UsePrototype{ public function shallow(){ $demo = new Demo(); $demo->string = "susan"; //新建 $object_shallow_first = new ConcretePrototype($demo); //浅复制 $object_shallow_second = $object_shallow_first->shallowCopy(); //之下代码可以删除 echo '新对象:
'; var_dump($object_shallow_first->getName()); echo '浅复制的对象
'; var_dump($object_shallow_second->getName()); echo '
'; $demo->string = "jack"; echo '我改变新建的对象属性:
'; var_dump($object_shallow_first->getName()); echo '浅复制是同一块内存,受影响
'; var_dump($object_shallow_second->getName()); echo '
'; } public function deep(){ //新建对象,构造函数没参数就不用带括号 $demo = new Demo; $demo->string = "Siri"; //新建 $object_shallow_first = new ConcretePrototype($demo); //浅复制 $object_shallow_second = $object_shallow_first->deepCopy(); //之下代码可以删除 echo '新对象:
'; var_dump($object_shallow_first->getName()); echo '深复制的对象
'; var_dump($object_shallow_second->getName()); echo '
'; $demo->string = "jack"; echo '我改变新建的对象属性:
'; var_dump($object_shallow_first->getName()); echo '深复制是完全新的对象,不受影响
'; var_dump($object_shallow_second->getName()); echo '
'; } } //调用 $up = new UsePrototype; $up->shallow(); echo '
'; $up->deep(); //原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是用对象内部提供的克隆方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂方法模式与抽象工厂都是通过工厂封装具体的 new 操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景,可能使用原型模式更简单、效率更高: //如果说我们的对象类型不是刚开始就能确定,而是在运行时确定的话,那么我们通过这个类型的对象克隆出一个新的类型更容易。 //有的时候我们可能在实际的项目中需要一个对象在某个状态下的副本,这个前提很重要,这点怎么理解呢,例如有的时候我们需要对比一个对象经过处理后的状态和处理前的状态是否发生过改变,可能我们就需要在执行某段处理之前,克隆这个对象此时状态的副本,然后等执行后的状态进行相应的对比,这样的应用在项目中也是经常会出现的。 //当我们处理的对象比较简单,并且对象之间的区别很小,可能只是很固定的几个属性不同的时候,使用原型模式更合适。 ?>
“PHP中的工厂模式和原型模式怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。