Вы не можете сделать это с SOAP
. По сути, ваш класс PHP отображается на структуру данных XML, которая определяется схемой XML. Это отображение включает только свойства и не может включать исполняемый код. SOAP
предназначен для взаимодействия, и, естественно, вы не можете делиться кодом, скажем, с PHP и Java или .NET. На принимающей стороне ваша структура данных XML преобразуется в структуру данных языка программирования клиента (класс PHP, если вы используете SoapClient
или класс 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>
Состояние SOAP в PHP может быть интересно, если вы делаете SOAP
в PHP.