|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。比来一个项目由“WinForm间接会见DB2”移植到“WinForm经由过程PHPWebService来会见DB2”。(长处是php能够架在Linux上,而Linux是收费的)这个命题的难点不是会见DB2,而是.NET挪用PHP的WebService。关于我这个临时作.NET,之前一向觉得只要.NET才能够做WebService……的人来讲,真是有点强“聪”所难了。可是成绩仍是要办理的,刻日就摆在长远呢。经由一番查询拜访,终究有了头绪,如今分享给人人。
起首要申明的,PHP服务器必要最少必要两个文件——一个WSDL文件和一个PHP文件。WSDL文件是一种机读的XML文件,用于形貌WebService供应的服务和挪用办法(关于.NET则能够主动天生挪用代码,非常好用),php文件就是真正完成的WEB服务了。
1)PHP服务器端代码
1-1)TestWebService.php代码
以下为援用的内容:
<?php
classTestWebService
{
publicfunctionHelloWorld()
{
returnarray("HelloWorldResult"=>"Hello");
}
publicfunctionGetArray($args)
{
/*
注重,WebService的办法在声明时最多一个参数,
但是在挪用该办法时就必需传value1,value2两个参数。
(这一点非常使人隐晦,我的了解是,在挪用该办法时,体系把一切参数都放到一个工具里传过去的)
*/
$value1=$args->value1;
$value2=$args->value2;//这两句是猎取真实的参数
$arry=array($value1,$value2);
//前往值也很出格,不是间接前往$arry,而是把它放到一个工具里再前往。
returnarray("GetArrayResult"=>$arry);
}
}
//创立WebSevice实例
$server=newSoapServer("TestWebService.wsdl");
//指定类名
$server->setClass("TestWebService");
$server->handle();
?>
1-2)TestWebService.wsdl代码
以下为援用的内容:
<?xmlversion="1.0"encoding="utf-8"?>
<wsdl:definitionsxmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"xmlns:tns="http://tempuri.org/"xmlns:s="http://www.w3.org/2001/XMLSchema"xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"targetNamespace="http://tempuri.org/"xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schemaelementFormDefault="qualified"targetNamespace="http://tempuri.org/">
<s:elementname="HelloWorld">
<s:complexType/>
</s:element>
<s:elementname="HelloWorldResponse">
<s:complexType>
<s:sequence>
<s:elementminOccurs="0"maxOccurs="1"name="HelloWorldResult"type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:elementname="GetArray">
<s:complexType>
<s:sequence>
<s:elementminOccurs="0"maxOccurs="1"name="value1"type="s:string"/>
<s:elementminOccurs="0"maxOccurs="1"name="value2"type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:elementname="GetArrayResponse">
<s:complexType>
<s:sequence>
<s:elementminOccurs="0"maxOccurs="1"name="GetArrayResult"type="tns:ArrayOfString"/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexTypename="ArrayOfString">
<s:sequence>
<s:elementminOccurs="0"maxOccurs="unbounded"name="string"nillable="true"type="s:string"/>
</s:sequence>
</s:complexType>
</s:schema>
</wsdl:types>
<wsdl:messagename="HelloWorldSoapIn">
<wsdl:partname="parameters"element="tns:HelloWorld"/>
</wsdl:message>
<wsdl:messagename="HelloWorldSoapOut">
<wsdl:partname="parameters"element="tns:HelloWorldResponse"/>
</wsdl:message>
<wsdl:messagename="GetArraySoapIn">
<wsdl:partname="parameters"element="tns:GetArray"/>
</wsdl:message>
<wsdl:messagename="GetArraySoapOut">
<wsdl:partname="parameters"element="tns:GetArrayResponse"/>
</wsdl:message>
<wsdl:portTypename="TestWebServiceSoap">
<wsdl:operationname="HelloWorld">
<wsdl:inputmessage="tns:HelloWorldSoapIn"/>
<wsdl:outputmessage="tns:HelloWorldSoapOut"/>
</wsdl:operation>
<wsdl:operationname="GetArray">
<wsdl:inputmessage="tns:GetArraySoapIn"/>
<wsdl:outputmessage="tns:GetArraySoapOut"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:bindingname="TestWebServiceSoap"type="tns:TestWebServiceSoap">
<soap:bindingtransport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operationname="HelloWorld">
<soap:operationsoapAction="http://tempuri.org/HelloWorld"style="document"/>
<wsdl:input>
<soap:bodyuse="literal"/>
</wsdl:input>
<wsdl:output>
<soap:bodyuse="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operationname="GetArray">
<soap:operationsoapAction="http://tempuri.org/GetArray"style="document"/>
<wsdl:input>
<soap:bodyuse="literal"/>
</wsdl:input>
<wsdl:output>
<soap:bodyuse="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:bindingname="TestWebServiceSoap12"type="tns:TestWebServiceSoap">
<soap12:bindingtransport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operationname="HelloWorld">
<soap12:operationsoapAction="http://tempuri.org/HelloWorld"style="document"/>
<wsdl:input>
<soap12:bodyuse="literal"/>
</wsdl:input>
<wsdl:output>
<soap12:bodyuse="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operationname="GetArray">
<soap12:operationsoapAction="http://tempuri.org/GetArray"style="document"/>
<wsdl:input>
<soap12:bodyuse="literal"/>
</wsdl:input>
<wsdl:output>
<soap12:bodyuse="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:servicename="TestWebService">
<wsdl:portname="TestWebServiceSoap"binding="tns:TestWebServiceSoap">
<soap:addresslocation="http://localhost/phpmyadmin/ws/TestWebService.php"/>
</wsdl:port>
<wsdl:portname="TestWebServiceSoap12"binding="tns:TestWebServiceSoap12">
<soap12:addresslocation="http://localhost/phpmyadmin/ws/TestWebService.php"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
WSDL的代码对照长,当办法良多时,手敲代码是不太大概的。有一个巧的举措,就是也用.NET完成一个不含真正办法体的WebSerivce,然后经由过程http://***/TestWebService.asmx?wsdl的办法天生wsdl代码文件。
关于WSDL文件,我要申明出格申明两点:
(1)soap:address结点是声明WebService的地点,在部署时要改成响应地点;
(2)一维数组的声明范例为ArrayOfType,字符串数组为ArrayOfString。假如Type不是复杂范例,则Type必要别的声明。
2).NET客户端代码
先要增加Web援用,地点为WSDL文件的Http地点。
挪用代码(C#)
以下为援用的内容:
//初始化WebService
localhost.TestWebServicesrv=newlocalhost.TestWebService();
//调第一个办法
stringstr=srv.HelloWorld();
//调第二个办法
string[]arry=srv.GetArray("string1","string2");
总结:(一)PHP是一种弱范例言语,反省毛病对照坚苦。array范例也与一样平常了解的数组分歧,它也有相似Hashtable的用法。
(二)PHPWebService办法的传进参数、前往值都最多有一个,由于真正挪用时的参数和前往值,都是包装到一个工具中传送的。
(三)PHPWebService也撑持自界说范例和自界说范例数组等庞大范例,但不撑持多组数组。
(四)若前往值必要是多张二维表时,我浅陋的觉得,能够传化一组字符串数组传送,格局为
[表1行数],[表1列数],[表1列名1],[表1列名2],……[表1列名N],[表1中按行列寄存的值]
[表2行数],[表2列数],[表2列名1],[表2列名2],……[表2列名N],[表2中按行列寄存的值]
……
[表M行数],[表M列数],[表M列名1],[表M列名2],……[表M列名N],[表2中按行列寄存的值]
按按次将下面[]中的内容串成字符串数组,效力还不错,我测试10000行240列的数据,我有现成编解代码,有乐趣的能够向我讨取.
语言是不是不是最重要的? |
|