本篇內(nèi)容介紹了“PHP中的工廠模式和原型模式怎么實現(xiàn)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
上代碼
<?php interface Prototype{ public function shallowCopy(); public function deepCopy(); } class ConcretePrototype implements Prototype{ private $_name; public function __construct($name){ $this->_name = $name; } public function setName($name){ $this->_name = $name; } public function shallowCopy(){ //在php語言中,用簡單的賦值語句是不能滿足這種需求的。要滿足這種需求雖然有很多途徑,但實現(xiàn)clone()方法是其中最簡單,也是最高效的手段。 //如果定義了__clone()方法,則新創(chuàng)建的對象(復(fù)制生成的對象)中的__clone()方法會被調(diào)用, 可用于修改屬性的值 //你要先new對象才能clone,一個是實例化,一個是克隆 //對象的復(fù)制是通過關(guān)鍵字 clone 來實現(xiàn)的。用 clone 克隆出來的對象與原對象沒有任何關(guān)系,它是把原來的對象從當(dāng)前的位置重新復(fù)制了一份,也就是相當(dāng)于在內(nèi)存中新開辟了一塊空間 return clone $this; } public function deepCopy(){ //序列化深拷貝:利用序列化來做深拷貝,把對象寫到流里的過程是序列化的過程,這一過程稱為“冷凍”或“腌咸菜”,反序列化對象的過程叫做“解凍”或“回鮮”。這種深復(fù)制比較簡單 //當(dāng)數(shù)組值包含如雙引號、單引號或冒號等字符時,它們被反序列化后,可能會出現(xiàn)問題。為了克服這個問題,一個巧妙的技巧是使用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); //淺復(fù)制 $object_shallow_second = $object_shallow_first->shallowCopy(); //之下代碼可以刪除 echo '新對象:<br/>'; var_dump($object_shallow_first->getName()); echo '淺復(fù)制的對象<br/>'; var_dump($object_shallow_second->getName()); echo '<br/>'; $demo->string = "jack"; echo '我改變新建的對象屬性:<br/>'; var_dump($object_shallow_first->getName()); echo '淺復(fù)制是同一塊內(nèi)存,受影響<br/>'; var_dump($object_shallow_second->getName()); echo '<br/>'; } public function deep(){ //新建對象,構(gòu)造函數(shù)沒參數(shù)就不用帶括號 $demo = new Demo; $demo->string = "Siri"; //新建 $object_shallow_first = new ConcretePrototype($demo); //淺復(fù)制 $object_shallow_second = $object_shallow_first->deepCopy(); //之下代碼可以刪除 echo '新對象:<br/>'; var_dump($object_shallow_first->getName()); echo '深復(fù)制的對象<br/>'; var_dump($object_shallow_second->getName()); echo '<br/>'; $demo->string = "jack"; echo '我改變新建的對象屬性:<br/>'; var_dump($object_shallow_first->getName()); echo '深復(fù)制是完全新的對象,不受影響<br/>'; var_dump($object_shallow_second->getName()); echo '<br/>'; } } //調(diào)用 $up = new UsePrototype; $up->shallow(); echo '<hr>'; $up->deep(); //原型模式的主要思想是基于現(xiàn)有的對象克隆一個新的對象出來,一般是用對象內(nèi)部提供的克隆方法,通過該方法返回一個對象的副本,這種創(chuàng)建對象的方式,相比我們之前說的幾類創(chuàng)建型模式還是有區(qū)別的,之前的講述的工廠方法模式與抽象工廠都是通過工廠封裝具體的 new 操作的過程,返回一個新的對象,有的時候我們通過這樣的創(chuàng)建工廠創(chuàng)建對象不值得,特別是以下的幾個場景,可能使用原型模式更簡單、效率更高: //如果說我們的對象類型不是剛開始就能確定,而是在運行時確定的話,那么我們通過這個類型的對象克隆出一個新的類型更容易。 //有的時候我們可能在實際的項目中需要一個對象在某個狀態(tài)下的副本,這個前提很重要,這點怎么理解呢,例如有的時候我們需要對比一個對象經(jīng)過處理后的狀態(tài)和處理前的狀態(tài)是否發(fā)生過改變,可能我們就需要在執(zhí)行某段處理之前,克隆這個對象此時狀態(tài)的副本,然后等執(zhí)行后的狀態(tài)進(jìn)行相應(yīng)的對比,這樣的應(yīng)用在項目中也是經(jīng)常會出現(xiàn)的。 //當(dāng)我們處理的對象比較簡單,并且對象之間的區(qū)別很小,可能只是很固定的幾個屬性不同的時候,使用原型模式更合適。 ?>
“PHP中的工廠模式和原型模式怎么實現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
當(dāng)前文章:PHP中的工廠模式和原型模式怎么實現(xiàn)-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://chinadenli.net/article10/dcjdgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、定制網(wǎng)站、ChatGPT、網(wǎng)頁設(shè)計公司、外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容