它';从web服务响应中获取长整数是不可能的


It's not possible to get a long integer from a web service response

我使用SoapClient类进行SOAP交互。当SOAP响应包含长整数时,PHP会将其转换为科学表示法。如何获取这样的值并在以后的SOAP请求中使用它?

我不能使用gmp,在我可以访问它之前,值被强制转换为float。gmp_init(): Unable to convert variable to GMP - wrong type

另请参阅:http://arstechnica.com/civis/viewtopic.php?t=100615

$wsld = 'http://example.com?wsdl';
$soap = new 'SoapClient($wsld);
$result=$soap->foo();
echo $result->return->id; // echo 1.1122233344456E+14 instead of 111222333444555;

也许您可以制作WSDL的本地副本,并将遇到问题的字段的数据类型更改为字符串。

这样做的缺点是必须跟踪XML的更改,但阻力最小的路径将为您提供更直接的解决方案。


另一种选择是,在某种程度上更健壮,查看SoapClient文档,可以使用类型映射选项。

typemap选项是一个类型映射数组。类型映射是一个数组,包含键Type_name、Type_ns(命名空间URI)、from_xml(接受一个字符串参数的回调)和to_xml(接受一种对象参数的回调。

也许这个其他答案可能会帮助您使用类型映射。在不了解您的模式的情况下,很难帮助您编写源代码,但该示例可能适用于您。

以下是上面答案中发布的源代码的逐字副本:

function to_long_xml($longVal) {
  return '<long>' . $longVal . '</long>';
}
function from_long_xml($xmlFragmentString) {
  return (string)strip_tags($xmlFragmentString);
}
$client = new SoapClient('http://acme.com/products.wsdl', array(
  'typemap' => array(
    array(
      'type_ns' => 'http://www.w3.org/2001/XMLSchema',
      'type_name' => 'long',
      'to_xml' => 'to_long_xml',
      'from_xml' => 'from_long_xml',
    ),
  ),
));