日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

《PHP設(shè)計(jì)模式介紹》第十一章 代理模式(3)_PHP教程

編輯Tag賺U幣
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

推薦:《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 {
function TestGetWeatherReport() {
$moline_weather = $this->client->getWeatherReport(‘KMLI’);
$this->assertIsA($moline_weather, ‘stdClass’);
$weather_tests = array(
‘timestamp’ => ‘String’
,’station’ => ‘stdClass’
,’phenomena’ => ‘Array’
,’precipitation’ => ‘Array’
,’extremes’ => ‘Array’
,’pressure’ => ‘stdClass’
,’sky’ => ‘stdClass’
,’temperature’ => ‘stdClass’
,’visibility’ => ‘stdClass’
,’wind’ => ‘stdClass’
);
foreach($weather_tests as $key => $isa) {
$this->assertIsA($moline_weather->$key,
$isa,
“$key should be $isa, actually [%s]”);
}
}
}

上面的代碼創(chuàng)建了屬性和返回類型的映射。你可以迭代這些預(yù)期值的列表,并使用assertIsA()驗(yàn)證正確的類型。當(dāng)然你以可以同樣的驗(yàn)證其他的集合對(duì)象。

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
(
[timestamp] => 2005-02-27T13:52:00Z
[station] => stdClass Object
(
[icao] => KMLI
[wmo] => 72544
[iata] =>
[elevation] => 179
[latitude] => 41。451
[longitude] => -90。515
[name] => Moline, Quad-City Airport
[region] => IL
[country] => United States
[string] => KMLI - Moline, Quad-City Airport, IL, United States @ 41。451’N -90。515’W 179m
)
// 。。。
[temperature] => stdClass Object
(
[ambient] => 0。6
[dewpoint] => -2。8
[relative_humidity] => 78
[string] => 0。6c (78% RH)
)
// 。。。
)

延遲代理

現(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ì)象之間能互

來(lái)源:模板無(wú)憂//所屬分類:PHP教程/更新時(shí)間:2008-08-22
相關(guān)PHP教程