一个简单的例子
上面的简单例子展示了代理模式的基本结构,当然我们需要一些更有趣和实际的例子
。 Web服务变得非常流行,
PHP5包含了一些支持的很好的协议,就如SOAP一样可以很容易的理解远程服务
。创建SOAP客户端的部分功能是为了处理WSDL文件。然而,你可以延迟处理WSDL文件直到你需要处理这个文件的时候。席面一个代理的例子将会展示远程代理访问SOAP服务和延迟实例化。
远程代理
首先,基于
PHP5风格,来一段创建简单的SoapClient对象的代码。你必须编译的时候加上—enable-soap选项,才能使用SoapClient类,如果你已经做过了,那么你就可以用URL形式,把WSDL文件传入构造器来创建SoapClient实例:
//PHP5
$client=newSoapClient(
‘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)
•ezSOAP(
http://ez.no/ez_publish/documentation/development/libraries/ez_soap)
•nusoap(
http://sf.net/projects/nusoap/).
所有这些php4的库在处理远程信息的格式化和传递的功能是使用PHP代码实现的,并且有远程代理的例子。
首先一个问题是你用什么方法让SoapClient做回应?运行var_dump(get_class_methods(get_class($client)));,你可以很容易的列举在运行时的方法。需要更加详细的例子的话,你可以参考下面的测试
案例:
classProxyTestCaseextendsUnitTestCase{
constWSDL=‘http://live.capescience.com/wsdl/GlobalWeather.wsdl’;
private$client;
functionsetUp(){
$this->client=newSoapClient(ProxyTestCase::WSDL);
}
functionTestMethodsOfSoapClient(){
$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升级的时候,这个测试放入程序进行测试对于监视你的程序会很有用,比如发现有什么方法增加了,或者是你可以发现哪些被依赖的方法被删除了,验证PHP编译的时候是否加入了SOAP选项。但必须要说的是,这个测试是极端的脆弱:其弱点就是会因为更改代码的原因,需要重构而且高度依赖函数列表的顺序。目前,虽然这个测试描述了SoapClient如何工作,如果你想要放一个类似的测试进行测试,最好还是重构它,用in_array函数来明确的寻找你需要测试的函数。你可以使用SoapClient::__getFunctions()方法很容易的了解指定的SOAP提供什么服务。在GlobalWeather.wsdl的
案例,你可以按照下面方法做:
classProxyTestCaseextendsUnitTestCase{
functionTestSoapFunctions(){
$globalweather_functions=array(
TheProxyPattern195
‘StationgetStation(string$code)’,
‘booleanisValidCode(string$code)’,
‘ArrayOfstringlistCountries()’,
‘ArrayOfStationsearchByCode(string$code)’,
‘ArrayOfStationsearchByCountry(string$country)’,
‘ArrayOfStationsearchByName(string$name)’,
‘ArrayOfStationsearchByRegion(string$region)’,
‘WeatherReportgetWeatherReport(string$code)’
);
$this->assertEqual(
$globalweather_functions,
$this->client->__getFunctions());
}
}
SoapClient::__getFunctions()会返回一个表示API的字符串数组给WEB服务。在每个方法中,都有返回类型,方法名,参数类型会被列出来。(建议你再次把上面那种测试方法放入程序中,已发布的web服务,如果做了变更将立即发出警告。你可以想象一下,由于API的改变产生了一个bug,天气信息忽然停止显示在你的页面,而你又没有察觉到。如果做了这类的检查,你会快速的获得因更改API而产生的警告。)