《PHP設(shè)計(jì)模式介紹》第十一章 代理模式(3)_PHP教程
推薦:《PHP設(shè)計(jì)模式介紹》第十章 規(guī)范模式在一個(gè)應(yīng)用軟件的成型過(guò)程中,一些意想不到的商業(yè)邏輯到處出現(xiàn)。比如,基于價(jià)格的考慮,這個(gè)任務(wù)必須減少項(xiàng)目;而那個(gè)任務(wù)也因?yàn)殇N售稅而必須選擇合適的比率;而其它的任務(wù)也必須因?yàn)槠渌奶貏e
因?yàn)閃eatherReport實(shí)際上并不是你程序中定義的類, SoapClient都象stdClass的實(shí)例化一樣的返回所有的對(duì)象。這時(shí)你也可以獲得返回對(duì)象的屬性的值。
|
class ProxyTestCase extends UnitTestCase { |
| class ProxyTestCase extends UnitTestCase { function TestGetWeatherReport() { // continued 。。。 $temp = $moline_weather->temperature; $temperature_tests = array( ‘ambient’ => ‘Float’ ,’dewpoint’ => ‘Float’ ,’relative_humidity’ => ‘Integer’ ,’string’ => ‘String’ ); foreach($temperature_tests as $key => $isa) { $this->assertIsA($temp->$key, $isa, “$key should be $isa, actually [%s]”); } } } |
上面的方法輸出的實(shí)際效果如下:
|
stdClass Object |
現(xiàn)在你基本掌握了PHP5風(fēng)格的SoapClient(如何做一個(gè)遠(yuǎn)程代理),但是你怎么才能寫一個(gè)延遲實(shí)例化的代理給SoapClient呢?
| class GlobalWeather { private $client; // ‘Station getStation(string $code)’, public function getStation($code) { return $this->client->getStation($code); } } |
getStation()可以代理$client變量指向的getStation()方法。不管如何,從這點(diǎn)上看, SoapClient實(shí)例并沒(méi)有創(chuàng)建,也沒(méi)有存儲(chǔ)到$client變量,因?yàn)樯厦嬉颜f(shuō)過(guò),對(duì)WSDL文件進(jìn)行遠(yuǎn)程處理應(yīng)該延遲到真正需要的時(shí)候。
你可以在插入一段延遲加載的代碼之前做一下client的調(diào)用,來(lái)延遲SoapClient的實(shí)例化
| class GlobalWeather { private $client; private function lazyLoad() { if (! $this->client instanceof SoapClient) { $this->client = new SoapClient( ‘http://live。capescience。com/wsdl/GlobalWeather。wsdl’); } } // ‘Station getStation(string $code)’, public function getStation($code) { $this->lazyLoad(); return $this->client->getStation($code); } } |
lazyLoad()中創(chuàng)建SoapClient對(duì)象是一定要的。這里存在一個(gè)問(wèn)題:如果我是一個(gè)懶惰的編碼者,讓我非常不爽是:我不得不在所有的代理方法中加入$this->lazyLoad();。有更加簡(jiǎn)便的方法嗎?當(dāng)然有,重寫一遍吧,使用PHP5新的特性來(lái)返回對(duì)象。改lazyLoad()的名字為client(),并在這個(gè)方法里面實(shí)例化$client,代理中的方法訪問(wèn)client()方法優(yōu)于訪問(wèn)$client屬性。把延遲實(shí)例化做的更加簡(jiǎn)單!
分享:《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)于訪問(wè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ǔ)過(guò)程使用內(nèi)置RETVAL獲取過(guò)程中的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ì)模式介紹》第十一章 代理模式(3)
。