Я использую SoapClient
класс для SOAP-взаимодействий. Когда ответ SOAP содержит длинное целое число, PHP преобразует его в научную нотацию. Как я могу получить такое значение и использовать его позже в запросе SOAP?
Я не могу использовать gmp, значение приводится к плавающей точке, прежде чем я могу получить к нему доступ. 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 вариант, который вы можете использовать.
Опция typemap представляет собой массив сопоставлений типов. Сопоставление типов — это массив с ключами type_name, type_ns (URI пространства имен), from_xml (обратный вызов, принимающий один строковый параметр) и to_xml (обратный вызов, принимающий один параметр объекта).
Возможно это другой ответ может помочь вам с использованием TypeMap. Не зная вашей схемы, трудно помочь вам с исходным кодом, но пример может быть применим к вам.
Вот дословная копия исходного кода, размещенного в ответе выше:
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',
),
),
));
Других решений пока нет …