《PHP設(shè)計(jì)模式介紹》第十一章 代理模式(2)_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
Web服務(wù)變得非常流行,PHP5包含了一些支持的很好的協(xié)議,就如SOAP一樣可以很容易的理解遠(yuǎn)程服務(wù)。 創(chuàng)建SOAP客戶端的部分功能是為了處理WSDL文件。然而,你可以延遲處理WSDL文件直到你需要處理這個(gè)文件的時(shí)候。席面一個(gè)代理的例子將會(huì)展示遠(yuǎn)程代理訪問(wèn)SOAP服務(wù)和延遲實(shí)例化。
遠(yuǎn)程代理
首先,基于PHP5風(fēng)格, 來(lái)一段創(chuàng)建簡(jiǎn)單的SoapClient對(duì)象的代碼。你必須編譯的時(shí)候加上—enable-soap選項(xiàng),才能使用SoapClient類,如果你已經(jīng)做過(guò)了,那么你就可以用URL形式,把WSDL文件傳入構(gòu)造器來(lái)創(chuàng)建SoapClient實(shí)例:
| // PHP5 $client = new SoapClient( ‘http://live。capescience。com/wsdl/GlobalWeather。wsdl’); |
注:PHP4風(fēng)格的SoapClients
在你編碼PHP4風(fēng)格的SOAP客戶端之前,PHP5的技術(shù)可以忽略。PHP5 的SoapClient是一個(gè)擴(kuò)展,所以它是原生的PHP的代碼,速度更加快(譯注:這里的原生PHP代碼應(yīng)該是原生代碼,原生代碼是指編譯性語(yǔ)言編寫的代碼),實(shí)際上是用C語(yǔ)言完成解析和格式化XML信息的功能。
PHP4風(fēng)格 SOAP庫(kù)包括:
| ? 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的庫(kù)在處理遠(yuǎn)程信息的格式化和傳遞的功能是使用PHP代碼實(shí)現(xiàn)的,并且有遠(yuǎn)程
代理的例子。
首先一個(gè)問(wèn)題是你用什么方法讓SoapClient做回應(yīng)? 運(yùn)行var_dump(get_class_methods(get_class($client)));,你可以很容易的列舉在運(yùn)行時(shí)的方法。需要更加詳細(xì)的例子的話,你可以參考下面的測(cè)試案例:
| 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))); } } |
咋一看,似乎寫了一個(gè)沒(méi)有用的測(cè)試,難道你只是為了在任意時(shí)候顯示這些信息而已?或許吧,在PHP升級(jí)的時(shí)候,這個(gè)測(cè)試放入程序進(jìn)行測(cè)試對(duì)于監(jiān)視你的程序會(huì)很有用,比如發(fā)現(xiàn)有什么方法增加了,或者是你可以發(fā)現(xiàn)哪些被依賴的方法被刪除了,驗(yàn)證PHP編譯的時(shí)候是否加入了SOAP選項(xiàng)。但必須要說(shuō)的是,這個(gè)測(cè)試是極端的脆弱:其弱點(diǎn)就是會(huì)因?yàn)楦拇a的原因,需要重構(gòu)而且高度依賴函數(shù)列表的順序。目前,雖然這個(gè)測(cè)試描述了SoapClient如何工作,如果你想要放一個(gè)類似的測(cè)試進(jìn)行測(cè)試,最好還是重構(gòu)它,用in_array函數(shù)來(lái)明確的尋找你需要測(cè)試的函數(shù)。你可以使用SoapClient::__getFunctions()方法很容易的了解指定的SOAP提供什么服務(wù)。 在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()會(huì)返回一個(gè)表示API的字符串?dāng)?shù)組給WEB服務(wù)。在每個(gè)方法中,都有返回類型,方法名,參數(shù)類型會(huì)被列出來(lái)。(建議你再次把上面那種測(cè)試方法放入程序中,已發(fā)布的web服務(wù),如果做了變更將立即發(fā)出警告。你可以想象一下,由于API的改變產(chǎn)生了一個(gè)bug,天氣信息忽然停止顯示在你的頁(yè)面,而你又沒(méi)有察覺(jué)到。如果做了這類的檢查,你會(huì)快速的獲得因更改API而產(chǎn)生的警告。)
最后讓我們看一個(gè)簡(jiǎn)單的實(shí)際例子來(lái)理解PHP5風(fēng)格的SoapClient這個(gè)服務(wù)。假設(shè)有這樣的一個(gè)例子,我們需要查看美國(guó)伊利諾斯州的moline的天氣。這個(gè)獲得當(dāng)前moline飛機(jī)場(chǎng)天氣狀態(tài)的代碼稱為”KMLI”,需要調(diào)用getWeatherReport()方法和傳遞’KMLI’字符串作為參數(shù)。這個(gè)調(diào)用將返回一個(gè)WeatherReport對(duì)象。
| class ProxyTestCase extends UnitTestCase { function TestGetWeatherReport() { $moline_weather = $this->client->getWeatherReport(‘KMLI’); $this->assertIsA($moline_weather, ‘stdClass’); } } |
分享:《PHP設(shè)計(jì)模式介紹》第九章 觀測(cè)模式一些面向?qū)ο蟮木幊谭绞剑峁┝艘环N構(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ì)模式介紹》第十一章 代理模式(2)
。