• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • SoapServer::addFunction()

    (PHP 5, PHP 7)

    添加一个或多个函数来处理SOAP请求

    说明

    publicSoapServer::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.