gpt4 book ai didi

php SoapVar 没有设置属性

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:44:31 25 4
gpt4 key购买 nike

我正在尝试向 soap 请求添加一些属性。 PHP.net ( http://php.net/manual/en/soapvar.soapvar.php ) 和 here 上评分最高的评论和 here在 SO 上都说同样的话:

$param = array(
"_" => 'value',
'attrName' => 'attributeName'
);
$p = new SoapVar($param, SOAP_ENC_OBJECT);

应该返回

<param attrName="attributeName">value</param>

这会很棒,除了当我运行那段代码时,我得到这个 XML:

<param>
<_>value</_>
<attrName>attributeName</attrName>
</param>

这显然是错误的。当然我不是世界上唯一有这个问题的人吗?自 2011 年以来,关于这一点功能的文档是否发生了变化?

最佳答案

是的,您不是唯一遇到此问题的人 - 我看过无数帖子,其中人们声称使用 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 知道元素和属性名称,并且可以将它们与数组索引相匹配。所以如果你想要你的属性,你必须让你的 SoapClient 处于 WSDL 模式。

基本上,为了实现您想要的效果,您需要在 的适当部分中使用 以文档/文字模式获取 WSDL 文件 block 。

为什么有些人声称属性的数组使用成功而其他人说“它不起作用”的原因完全在于他们的设置:有些人有 WSDL 文件要使用,有些人只是想做 new SoapClient(null,大批(...)); (这当然超出了他们的预期)

关于php SoapVar 没有设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24870910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com