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

《PHP設計模式介紹》第十一章 代理模式(2)_PHP教程

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

推薦:《PHP設計模式介紹》第十章 規(guī)范模式
在一個應用軟件的成型過程中,一些意想不到的商業(yè)邏輯到處出現(xiàn)。比如,基于價格的考慮,這個任務必須減少項目;而那個任務也因為銷售稅而必須選擇合適的比率;而其它的任務也必須因為其他的特別

Web服務變得非常流行,PHP5包含了一些支持的很好的協(xié)議,就如SOAP一樣可以很容易的理解遠程服務。 創(chuàng)建SOAP客戶端的部分功能是為了處理WSDL文件。然而,你可以延遲處理WSDL文件直到你需要處理這個文件的時候。席面一個代理的例子將會展示遠程代理訪問SOAP服務和延遲實例化。

遠程代理

首先,基于PHP5風格, 來一段創(chuàng)建簡單的SoapClient對象的代碼。你必須編譯的時候加上—enable-soap選項,才能使用SoapClient類,如果你已經(jīng)做過了,那么你就可以用URL形式,把WSDL文件傳入構(gòu)造器來創(chuàng)建SoapClient實例:

// PHP5
$client = new SoapClient(
‘http://live。capescience。com/wsdl/GlobalWeather。wsdl’);

注:PHP4風格的SoapClients

在你編碼PHP4風格的SOAP客戶端之前,PHP5的技術可以忽略。PHP5 的SoapClient是一個擴展,所以它是原生的PHP的代碼,速度更加快(譯注:這里的原生PHP代碼應該是原生代碼,原生代碼是指編譯性語言編寫的代碼),實際上是用C語言完成解析和格式化XML信息的功能。

PHP4風格 SOAP庫包括:

? phpsoaptoolkit (http://phpsoaptoolkit。sf。net/phpsoap/),
? PEAR::SOAP (
http://pear。php。net/package/SOAP)
? ez SOAP (
http://ez。no/ez_publish/documentation/development/libraries/ez_soap)
? nusoap (
http://sf
。net/projects/nusoap/)。

所有這些php4的庫在處理遠程信息的格式化和傳遞的功能是使用PHP代碼實現(xiàn)的,并且有遠程

代理的例子。

首先一個問題是你用什么方法讓SoapClient做回應? 運行var_dump(get_class_methods(get_class($client)));,你可以很容易的列舉在運行時的方法。需要更加詳細的例子的話,你可以參考下面的測試案例:

class ProxyTestCase extends UnitTestCase {
const WSDL = ‘http://live。capescience。com/wsdl/GlobalWeather。wsdl’;
private $client;
function setUp() {
$this->client = new SoapClient(ProxyTestCase::WSDL);
}
function TestMethodsOfSoapClient() {
$soap_client_methods = array(
‘__construct’,
‘__call’,
‘__soapCall’,
‘__getLastRequest’,
‘__getLastResponse’,
‘__getLastRequestHeaders’,
‘__getLastResponseHeaders’,
‘__getFunctions’,
‘__getTypes’,
‘__doRequest’);
$this->assertEqual(
$soap_client_methods, get_class_methods(get_class($this->client)));
}
}

咋一看,似乎寫了一個沒有用的測試,難道你只是為了在任意時候顯示這些信息而已?或許吧,在PHP升級的時候,這個測試放入程序進行測試對于監(jiān)視你的程序會很有用,比如發(fā)現(xiàn)有什么方法增加了,或者是你可以發(fā)現(xiàn)哪些被依賴的方法被刪除了,驗證PHP編譯的時候是否加入了SOAP選項。但必須要說的是,這個測試是極端的脆弱:其弱點就是會因為更改代碼的原因,需要重構(gòu)而且高度依賴函數(shù)列表的順序。目前,雖然這個測試描述了SoapClient如何工作,如果你想要放一個類似的測試進行測試,最好還是重構(gòu)它,用in_array函數(shù)來明確的尋找你需要測試的函數(shù)。你可以使用SoapClient::__getFunctions()方法很容易的了解指定的SOAP提供什么服務。 在GlobalWeather.wsdl的案例,你可以按照下面方法做:

class ProxyTestCase extends UnitTestCase {
function TestSoapFunctions() {
$globalweather_functions = array(
‘Station getStation(string $code)’,
‘boolean isValidCode(string $code)’,
‘ArrayOfstring listCountries()’,
‘ArrayOfStation searchByCode(string $code)’,
‘ArrayOfStation searchByCountry(string $country)’,
‘ArrayOfStation searchByName(string $name)’,
‘ArrayOfStation searchByRegion(string $region)’,
‘WeatherReport getWeatherReport(string $code)’
);
$this->assertEqual(
$globalweather_functions,
$this->client->__getFunctions());
}
}

SoapClient::__getFunctions()會返回一個表示API的字符串數(shù)組給WEB服務。在每個方法中,都有返回類型,方法名,參數(shù)類型會被列出來。(建議你再次把上面那種測試方法放入程序中,已發(fā)布的web服務,如果做了變更將立即發(fā)出警告。你可以想象一下,由于API的改變產(chǎn)生了一個bug,天氣信息忽然停止顯示在你的頁面,而你又沒有察覺到。如果做了這類的檢查,你會快速的獲得因更改API而產(chǎn)生的警告。)

最后讓我們看一個簡單的實際例子來理解PHP5風格的SoapClient這個服務。假設有這樣的一個例子,我們需要查看美國伊利諾斯州的moline的天氣。這個獲得當前moline飛機場天氣狀態(tài)的代碼稱為”KMLI”,需要調(diào)用getWeatherReport()方法和傳遞’KMLI’字符串作為參數(shù)。這個調(diào)用將返回一個WeatherReport對象。

class ProxyTestCase extends UnitTestCase {
function TestGetWeatherReport() {
$moline_weather = $this->client->getWeatherReport(‘KMLI’);
$this->assertIsA($moline_weather, ‘stdClass’);
}
}

分享:《PHP設計模式介紹》第九章 觀測模式
一些面向?qū)ο蟮木幊谭绞�,提供了一種構(gòu)建對象間復雜網(wǎng)絡互連的能力。當對象們連接在一起時,它們就可以相互提供服務和信息。 通常來說,當某個對象的狀態(tài)發(fā)生改變時,你仍然需要對象之間能互

來源:模板無憂//所屬分類:PHP教程/更新時間:2008-08-22
相關PHP教程