《PHP設(shè)計(jì)模式介紹》第十一章 代理模式(4)_PHP教程
推薦:《PHP設(shè)計(jì)模式介紹》第十章 規(guī)范模式在一個(gè)應(yīng)用軟件的成型過程中,一些意想不到的商業(yè)邏輯到處出現(xiàn)。比如,基于價(jià)格的考慮,這個(gè)任務(wù)必須減少項(xiàng)目;而那個(gè)任務(wù)也因?yàn)殇N售稅而必須選擇合適的比率;而其它的任務(wù)也必須因?yàn)槠渌奶貏e
| class GlobalWeather { private function client() { if (! $this->client instanceof SoapClient) { $this->client = new SoapClient( ‘http://live。capescience。com/wsdl/GlobalWeather。wsdl’); } return $this->client; } // 。。。 // ‘boolean isValidCode(string $code) public function isValidCode($code) { return $this->client()->isValidCode($code); } // and so on for other SOAP service methods 。。。 // ‘WeatherReport getWeatherReport(string $code) public function getWeatherReport($code) { return $this->client()->getWeatherReport($code); } } |
你迷上GlobalWeather服務(wù)的延遲實(shí)例代理類了嗎?你有一個(gè)類可以在任何時(shí)間在你的程序里面創(chuàng)建,并且在不需要它們的時(shí)候就不解析的遠(yuǎn)程資源。使用代理類還有另外一個(gè)優(yōu)勢(shì):使用代理可以列舉SOAP所支持的方法,你現(xiàn)在就可以對(duì)這個(gè)類進(jìn)行測(cè)試。
注:延遲代理可延遲異常
在PHP5里,創(chuàng)建一個(gè)對(duì)象會(huì)產(chǎn)生一個(gè)異常。使用延遲實(shí)例化代理,你可以延遲這個(gè)潛在的異常直到第一次使用方法創(chuàng)建對(duì)象的時(shí)候。。(你可以試試用代理完成這個(gè)功能。)這明顯不是代理模式的重點(diǎn),但是往往有一些事情,你需要記住。
動(dòng)態(tài)代理
PHP5提供一些很好的特性,可以快速的封裝一個(gè)代理類而不用明確的寫出每一個(gè)方法。
| class GenericProxy { protected $subject; public function __construct($subject) { $this->subject = $subject; } public function __call($method, $args) { return call_user_func_array( array($this->subject, $method), $args); } } |
這里的關(guān)鍵是_call()方法(通過EXPERIMENTAL擴(kuò)展重載,同樣可用于PHP4)。代理類中的_call方法允許你通過$subject代替的方式來(lái)重定義每個(gè)調(diào)用。由于__call()比其他方法的優(yōu)先級(jí)別都低,你可以在代理類中定義一個(gè)方法,讓__call()來(lái)代替執(zhí)行,于是你可以加一些特別的需求到你使用的代理模式。
總結(jié)
代理模式在很多情況下都非常有用,特別是你想強(qiáng)行控制一個(gè)對(duì)象的時(shí)候,比如:延遲加載,監(jiān)視狀態(tài)變更的方法等等。這章通過開發(fā)GlobalWeather類做示范,以后你也可以使用代理模式在你的本地計(jì)算機(jī)上使用遠(yuǎn)程資源:
動(dòng)態(tài)代理在編寫代碼的時(shí)候非常簡(jiǎn)單,因此可以很快速和容易的實(shí)現(xiàn)在你的程序中。然而(所有的實(shí)現(xiàn)都依賴__call()方法),反射并不能在對(duì)象內(nèi)部具備這樣的可見性(譯注:反射一般是在不了解類的內(nèi)部情況下操作的)。在特殊情況下,如果你使用一個(gè)代理就需要一個(gè)接口,你不能老是依賴于__call()方法,至少必須編碼的時(shí)候,應(yīng)該把接口所有的方法很明確的寫入你的代理類。
分享:《PHP設(shè)計(jì)模式介紹》第九章 觀測(cè)模式一些面向?qū)ο蟮木幊谭绞�,提供了一種構(gòu)建對(duì)象間復(fù)雜網(wǎng)絡(luò)互連的能力。當(dāng)對(duì)象們連接在一起時(shí),它們就可以相互提供服務(wù)和信息。 通常來(lái)說(shuō),當(dāng)某個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),你仍然需要對(duì)象之間能互
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- php類:注冊(cè)與自動(dòng)加載
- PHP 異步執(zhí)行方法,模擬多線程的應(yīng)用分析
- PHP中使用協(xié)同程序?qū)崿F(xiàn)合作多任務(wù)第1/2頁(yè)
- 不需要GD庫(kù)的情況下實(shí)現(xiàn)驗(yàn)證碼
- php調(diào)用MsSQL存儲(chǔ)過程使用內(nèi)置RETVAL獲取過程中的return值
- 解析PHP如何輸出簡(jiǎn)單動(dòng)態(tài)WAP頁(yè)面
- 《PHP設(shè)計(jì)模式介紹》第五章 注冊(cè)模式
- vim下高亮顯示php代碼
- 動(dòng)態(tài)網(wǎng)頁(yè)P(yáng)HP中引用
- 用PHP寫的MD5加密函數(shù)
- 相關(guān)鏈接:
- 教程說(shuō)明:
PHP教程-《PHP設(shè)計(jì)模式介紹》第十一章 代理模式(4)
。