SoapServer::addFunction()
(PHP 5, PHP 7)
添加一个或多个函数来处理SOAP请求
说明
public SoapServer::addFunction(mixed $functions): void
为远程客户端导出一个或多个函数
参数
- $functions
导出一个函数,将函数名作为字符串传递给这个参数。
导出多个函数,将一组函数名作为数组传递。
导出所有函数,传递特殊常量
SOAP_FUNCTIONS_ALL
.Note:
$functions接收的所有输入参数必须同时和WSDL文件中定义的顺序一样(它们不应该接收任何输出变量作为参数)并且返回一个或多个值。如果要返回多个值,它们必须返回一组被命名的输出参数作为数组。
返回值
没有返回值。
范例
Example #1 SoapServer::addFunction() example
<?php function echoString($inputString) { return $inputString; } $server->addFunction("echoString"); function echoTwoStrings($inputString1, $inputString2) { return array("outputString1" => $inputString1, "outputString2" => $inputString2); } $server->addFunction(array("echoString", "echoTwoStrings")); $server->addFunction(SOAP_FUNCTIONS_ALL); ?>
参见
- SoapServer::SoapServer() SoapServer constructor
- SoapServer::setClass() Sets the class which handles SOAP requests
Be careful with SOAP_FUNCTIONS_ALL, as it adds ALL availiable PHP functions to your server. This can be a potential security threat, imagine clients doing this: echo $client->file_get_contents("c:\\my files\\my_passwords.doc"); And voila, they have the contents of your file my_passwords.doc.
In response to comment by Nathan O'Sullivan about returning (or passing) a complex type, you can also use the stdClass() object. Assume you define a complex type like so: <xsd:complexType name="TestType"> <xsd:all> <xsd:element name="A" type="xsd:string" /> <xsd:element name="B" type="xsd:int" /> <xsd:element name="C" type="xsd:boolean" /> </xsd:all> </xsd:complexType> To use an object in place of an array you can do: $test = new stdClass(); $test->A = "test string"; $test->B = 45; $test->C = false; $result = $client->Test($test);
You may be left wondering, as I was, how to return a complex type - consider the following WSDL snippets, for a method called Login: <xs:element name="Login"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="1" name="username" type="xs:string" /> <xs:element minOccurs="0" maxOccurs="1" name="password" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="UserInfo"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="1" name="Id" type="xs:string" /> <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" /> <xs:element minOccurs="0" maxOccurs="1" name="Nickname" type="xs:string" /> <xs:element minOccurs="0" maxOccurs="1" name="Email" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="LoginResponse"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="1" name="LoginResult" type="s0:UserInfo" /> </xs:sequence> </xs:complexType> </xs:element> Here's a working Login function that I've added with add SoapServer::addFunction function Login($username, $password) { return array("LoginResult", array("Id"=>1, "Name"=>"Nathan", "Nickname"=>"Nathan", "Email"=>"email address") ); } The UserInfo complextype is represented by the inner array. The outer array has just one element, "LoginResult". The LogineResponse element seems to be treated as a one-member array by PHP.