©
本文档使用
php.cn手册 发布
(PHP 5 >= 5.0.1)
SoapServer::addFunction — 添加一个或多个函数来处理SOAP请求
$functions
)为远程客户端导出一个或多个函数
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 );
?>
[#1] dotpointer at gmail dot com [2007-10-26 18:52:33]
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.
[#2] Evan Borgstrom [2006-08-23 15:42:54]
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);
[#3] Nathan O'Sullivan [2005-04-28 23:36:29]
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.