有没有办法用他的方法在肥皂中返回一个对象?如果我在WSDL中返回xsd:struct我只获取对象的属性,但我不能使用任何方法。
例如
class person
{
var $name = "My name";
public function getName()
{
return $this->name;
}
}
所以在获取对象之后:
$client = new SoapClient();
$person = $client->getPerson();
echo $person->getName(); // Return "My Name";
感谢。
答案 0 :(得分:3)
您无法使用SOAP
执行此操作。基本上,您的PHP类被映射到由XML模式定义的XML数据结构。此映射仅包含属性,不能包含可执行代码。 SOAP
旨在实现互操作性,当然,您不能在PHP和Java或.NET之间共享代码。在接收端,您的XML数据结构正在转换为客户端编程语言的数据结构(如果您使用SoapClient
,则使用PHP类;如果使用C#
,则使用C#
类)。由于XML数据结构仅携带属性信息,因此无法重建原始类的可执行部分。
但是如果SOAP服务器和连接客户端都可以访问相同的代码库(这意味着相同的类),那么有一件事可以帮助。您可以使用XML
- 选项在PHP
的构造函数中定义SoapClient
类型和classmap
类之间的映射。这允许SoapClient
将传入的XML数据结构映射到真正的PHP类 - 假设服务器和客户端都可以访问相关的类定义。这允许您在SOAP
通信的接收方使用方法。
class book {
public $a = "a";
public $b = "c";
public function getName() {
return $this->a.' '.$this->b;
}
}
$options = array(
'classmap' => array('book' => 'book')
);
$client = new SoapClient('path/to/wsdl', $options);
$book = $client->test();
echo $book->getName();
WSDL
可能看起来像(从SoapClient
测试中复制并复制了一次):
<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.nothing.com" targetNamespace="http://schemas.nothing.com">
<wsdl:types>
<xsd:schema targetNamespace="http://schemas.nothing.com">
<xsd:complexType name="book">
<xsd:all>
<xsd:element name="a" type="xsd:string"/>
<xsd:element name="b" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<message name="testRequest">
</message>
<message name="testResponse">
<part name="res" type="tns:book"/>
</message>
<portType name="testPortType">
<operation name="test">
<input message="tns:testRequest"/>
<output message="tns:testResponse"/>
</operation>
</portType>
<binding name="testBinding" type="tns:testPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="test">
<soap:operation soapAction="http://localhost:81/test/interface.php?class=test/dotest" style="rpc"/>
<input>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://schemas.nothing.com"/>
</input>
<output>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://schemas.nothing.com"/>
</output>
</operation>
</binding>
<service name="test">
<port name="testPort" binding="tns:testBinding">
<soap:address location="http://localhost:81/test/interface.php?class=test"/>
</port>
</service>
</wsdl:definitions>
如果您在PHP中执行SOAP
,那么The State of SOAP in PHP可能会很有趣。