《PHP設(shè)計模式介紹》第十一章 代理模式(3)_PHP教程
推薦:《PHP設(shè)計模式介紹》第十章 規(guī)范模式在一個應(yīng)用軟件的成型過程中,一些意想不到的商業(yè)邏輯到處出現(xiàn)。比如,基于價格的考慮,這個任務(wù)必須減少項目;而那個任務(wù)也因為銷售稅而必須選擇合適的比率;而其它的任務(wù)也必須因為其他的特別
因為WeatherReport實際上并不是你程序中定義的類, SoapClient都象stdClass的實例化一樣的返回所有的對象。這時你也可以獲得返回對象的屬性的值。
|
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]”); } } } |
上面的方法輸出的實際效果如下:
|
stdClass Object |
現(xiàn)在你基本掌握了PHP5風(fēng)格的SoapClient(如何做一個遠程代理),但是你怎么才能寫一個延遲實例化的代理給SoapClient呢?
| class GlobalWeather { private $client; // ‘Station getStation(string $code)’, public function getStation($code) { return $this->client->getStation($code); } } |
getStation()可以代理$client變量指向的getStation()方法。不管如何,從這點上看, SoapClient實例并沒有創(chuàng)建,也沒有存儲到$client變量,因為上面已說過,對WSDL文件進行遠程處理應(yīng)該延遲到真正需要的時候。
你可以在插入一段延遲加載的代碼之前做一下client的調(diào)用,來延遲SoapClient的實例化
| 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對象是一定要的。這里存在一個問題:如果我是一個懶惰的編碼者,讓我非常不爽是:我不得不在所有的代理方法中加入$this->lazyLoad();。有更加簡便的方法嗎?當(dāng)然有,重寫一遍吧,使用PHP5新的特性來返回對象。改lazyLoad()的名字為client(),并在這個方法里面實例化$client,代理中的方法訪問client()方法優(yōu)于訪問$client屬性。把延遲實例化做的更加簡單!
分享:《PHP設(shè)計模式介紹》第九章 觀測模式一些面向?qū)ο蟮木幊谭绞剑峁┝艘环N構(gòu)建對象間復(fù)雜網(wǎng)絡(luò)互連的能力。當(dāng)對象們連接在一起時,它們就可以相互提供服務(wù)和信息。 通常來說,當(dāng)某個對象的狀態(tài)發(fā)生改變時,你仍然需要對象之間能互
- 相關(guān)鏈接:
- 教程說明:
PHP教程-《PHP設(shè)計模式介紹》第十一章 代理模式(3)
。