是的,你不是唯一一个遇到这个问题的人 – 我看到过无数的帖子,人们声称使用SOAP_ENC_OBJECT传递给SoapVar的数组解决了这个问题,而其他人则在同一帖子上声称没有.并且文档不清楚的原因(除了我的帖子年前在php.net的评论部分).
面对同样的问题,我已经阅读了PHP SOAP扩展的来源.基本上你使用的语法绝对正确:
$param = array(
"_" => 'value',
'attrName' => 'attributeName'
);
$p = new SoapVar($param, SOAP_ENC_OBJECT);
文档没有说明:这种语法可能会产生两种不同的结果(实际上甚至更多:PHP SOAP可能以八种不同的方式表达它).正如您可能看到上面的代码含糊不清:上面的代码中说’attrName’是属性而不是元素?没有.上面的代码没有足够的信息供SoapClient决定’attrName’是什么,所以它默认为“一个元素”.
SoapClient可以以两种模式运行:非WSDL和WSDL.在以前的模式中,您永远不会得到您想要的结果:SoapClient依赖于类型信息以将数组元素转换为属性.由于非WSDL模式中不存在类型信息,SoapClient将提供的数组表示为元素集 – 正是您所获得的.在WSDL模式中,存在类型信息,因此SoapClient知道元素和属性名称,并且可以将它们与数组索引匹配.因此,如果您需要属性,则必须在WSDL模式下使用SoapClient.
基本上为了实现你想要的东西你需要在文档/文字模式下使用< xsd:attribute name =“attrName”type =“xsd:string”/>在< xsd:schema>的相应部分中块.
一些人声称成功使用属性的数组和其他人说“它不起作用”的原因在于它们的设置:有些人有WSDL文件要消耗,有些人只是想尝试新的SoapClient(null,array(. ..)); (这当然不符合他们的期望)