Php 如何将复杂类型映射到现有类

Php 如何将复杂类型映射到现有类,php,wsdl,Php,Wsdl,我想将现有类型映射到wsdl类型 wsdl复杂类型 <types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/service1/"> <xsd:complexType name="RequestDescriptor"> <xsd:all> <xsd:element

我想将现有类型映射到wsdl类型

wsdl复杂类型

 <types>
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/service1/">
   <xsd:complexType name="RequestDescriptor">
    <xsd:all>
     <xsd:element name="language" type="xsd:string" default="xx"></xsd:element>
     <xsd:element name="siteAPIKey" type="xsd:string" default="xxxx"></xsd:element>
     <xsd:element name="userID" type="xsd:int" default="-1"></xsd:element>
     <xsd:element name="sessionID" type="xsd:string" default="-1"></xsd:element>
     <xsd:element name="returnDataFormat" type="xsd:string" default="XX"></xsd:element>
    </xsd:all>
   </xsd:complexType>
  </xsd:schema>
 </types>
当我调用服务器日志中的任何函数时,会显示以下消息

PHP可捕获致命错误:传递给xx::XXX()的参数1必须是RequestDescriptor的实例,给定stdClass的实例


但是它按预期运行并返回结果如何修复这个{PHP Catchable fatal error}

除了作为结构/变量持有者之外,您声称要发送的
RequestDescriptor
类还有其他功能吗?如果没有,就放下classmap,继续抛出stdClass对象


如果它执行其他操作,您将必须跟踪stdClass对象的传递位置,而不是
RequestDescriptor
实例(可能在您不期望的位置,因为请求可能会失败,因此会处理更多请求)。来自该实例的回溯可以帮助您很多,可能会使用另一个具有自定义
\u call()
方法的soapclient类来扩展您的soapclient类,该方法显式地对此进行测试,在出现错误情况时执行
调试\u print\u回溯()
,或者只调用
父::\u call()
一切正常。

首先:RequestDescriptor只是一个bean(数据持有者类)。。第二:我已经将soapclient委托给了一个代理类,我还检查了参数是否包含stdClass,但我认为wsdl文件中没有问题。不,问题不在wsdl文件中。问题在于你通过的论点。您在函数参数中放置了一个匿名/stdClass对象,而之前您声称只需要RequestDescriptorTR实例。所以,修复这个问题(或者显示调用客户端的代码)。。。我是编写代码的人,我知道我通过了什么参数。。。正如我告诉你的那样简单,我已将类委托给代理,在调用SoapClient对象之前,我打印数据,它只是RequestDescriptor的一个对象,代码如下函数XXXX(…){print_r($args);/*print array(RequestDescriptor对象详细信息)而不是stdclass*/return SoapClient->\u soapCall($functionName,$args)}是否要共享
打印\r
参数详细信息?也许你忘了用数组或其他同样琐碎的东西来包装它。另外:您可能正在编写代码,但您正在寻求帮助。PHP没有撒谎:您将stdObject传递到某个地方,可能是在一个意外的位置,但我比您更信任PHP错误日志,无意冒犯;)
<wsdl:message name="getXXRequest">
  <wsdl:part name="requestDescriptor" type="xsd1:RequestDescriptor"/>
 </wsdl:message>
 <wsdl:message name="getXXResponse">
  <wsdl:part name="getXXResponse" type="xsd:anytype"/>
 </wsdl:message>
$soapClient = new SoapClient($soapServiceURL,array("classmap"=>array("RequestDescriptor","RequestDescriptor")));