一個簡單的例子
上面的簡單例子展示了代理模式的基本結(jié)構(gòu),當(dāng)然我們需要一些更有趣和實際的例子。
Web服務(wù)變得非常流行,PHP5包含了一些支持的很好的協(xié)議,就如SOAP一樣可以很容易的理解遠(yuǎn)程服務(wù)。 創(chuàng)建SOAP客戶端的部分功能是為了處理WSDL文件。然而,你可以延遲處理WSDL文件直到你需要處理這個文件的時候。席面一個代理的例子將會展示遠(yuǎn)程代理訪問SOAP服務(wù)和延遲實例化。
遠(yuǎn)程代理
首先,基于PHP5風(fēng)格, 來一段創(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風(fēng)格的SoapClients 在你編碼PHP4風(fēng)格的SOAP客戶端之前,PHP5的技術(shù)可以忽略。PHP5 的SoapClient是一個擴(kuò)展,所以它是原生的PHP的代碼,速度更加快(譯注:這里的原生PHP代碼應(yīng)該是原生代碼,原生代碼是指編譯性語言編寫的代碼),實際上是用C語言完成解析和格式化XML信息的功能。
PHP4風(fēng)格 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的庫在處理遠(yuǎn)程信息的格式化和傳遞的功能是使用PHP代碼實現(xiàn)的,并且有遠(yuǎn)程代理的例子。
首先一個問題是你用什么方法讓SoapClient做回應(yīng)? 運行var_dump(get_class_methods(get_class($client)));,你可以很容易的列舉在運行時的方法。需要更加詳細(xì)的例子的話,你可以參考下面的測試案例:
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升級的時候,這個測試放入程序進(jìn)行測試對于監(jiān)視你的程序會很有用,比如發(fā)現(xiàn)有什么方法增加了,或者是你可以發(fā)現(xiàn)哪些被依賴的方法被刪除了,驗證PHP編譯的時候是否加入了SOAP選項。但必須要說的是,這個測試是極端的脆弱:其弱點就是會因為更改代碼的原因,需要重構(gòu)而且高度依賴函數(shù)列表的順序。目前,雖然這個測試描述了SoapClient如何工作,如果你想要放一個類似的測試進(jìn)行測試,最好還是重構(gòu)它,用in_array函數(shù)來明確的尋找你需要測試的函數(shù)。你可以使用SoapClient::__getFunctions()方法很容易的了解指定的SOAP提供什么服務(wù)。 在GlobalWeather.wsdl的案例,你可以按照下面方法做:
class ProxyTestCase extends UnitTestCase { function TestSoapFunctions() { $globalweather_functions = array( The Proxy Pattern 195 ‘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的字符串?dāng)?shù)組給WEB服務(wù)。在每個方法中,都有返回類型,方法名,參數(shù)類型會被列出來。(建議你再次把上面那種測試方法放入程序中,已發(fā)布的web服務(wù),如果做了變更將立即發(fā)出警告。你可以想象一下,由于API的改變產(chǎn)生了一個bug,天氣信息忽然停止顯示在你的頁面,而你又沒有察覺到。如果做了這類的檢查,你會快速的獲得因更改API而產(chǎn)生的警告。)
出處:phpchina
責(zé)任編輯:bluehearts
上一頁 php設(shè)計模式介紹之章代理模式 [1] 下一頁 php設(shè)計模式介紹之章代理模式 [3]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|