Zend-Soap PHP WebService返回数组异常:结果转为stdClass问题求助
解决Zend-Soap返回数组变为stdClass对象的问题
我之前开发Zend-Soap服务时也踩过这个一模一样的坑——明明服务端返回的是数组,客户端拿到手就变成了stdClass对象,折腾了好一会儿才搞定。给你几个实用的解决办法:
1. 服务端明确标注返回类型(最推荐)
Zend-Soap依赖注释生成WSDL,如果你没明确指定返回数组类型,它会默认把复杂结构解析成对象。修改你的Hello类方法注释,明确标注返回数组:
class Hello { /** * 返回问候语数组 * @return string[] 这里明确指定是字符串数组类型 */ public function sayHello() { return ['Hello', 'Zend-Soap', 'World']; } }
重新生成WSDL后,客户端就能正确识别数组类型,不会再转成stdClass了。
2. 配置Zend_Soap_Server的类型映射
如果注释标注还没解决,可以在服务端创建Server实例时,添加类型映射或者指定SOAP版本:
// 初始化SOAP Server $server = new Zend_Soap_Server(null, [ 'uri' => 'http://your-service-domain/hellows.php', 'soap_version' => SOAP_1_2 // SOAP 1.2对数组的解析更严格准确 ]); // 添加类型映射,告诉Server如何处理数组 $typemap = [ [ 'type_name' => 'ArrayOfString', 'type_ns' => 'http://schemas.xmlsoap.org/soap/encoding/', 'from_xml' => null, 'to_xml' => null ] ]; $server->setTypeMap($typemap); $server->setClass('Hello'); $server->handle();
3. 客户端手动转换对象为数组
如果暂时没法修改服务端,客户端可以通过递归函数把stdClass转换成数组:
// 递归转换对象为数组的工具函数 function objectToArray($data) { if (is_object($data)) { $data = get_object_vars($data); } return is_array($data) ? array_map(__FUNCTION__, $data) : $data; } // 调用SOAP服务并转换结果 $client = new Zend_Soap_Client('http://your-service-domain/hellows.php?wsdl'); $result = $client->sayHello(); $arrayResult = objectToArray($result); var_dump($arrayResult); // 现在就能看到预期的数组了
问题根源
本质上是SOAP协议的XML结构在解析时,如果WSDL没有明确声明数组类型,Zend-Soap会默认将其解析为stdClass对象。所以最根本的解决方式还是在服务端明确标注类型,让WSDL准确描述返回结构。
内容的提问来源于stack exchange,提问作者jjoselon
相关产品推荐
相关产品推荐

