如何";“正常化”;SoapClient中的php对象具有不一致的结构?
我有一个php stdObject,它是一个对象,有时是一个对象数组 编辑:它已由如何";“正常化”;SoapClient中的php对象具有不一致的结构?,php,oop,Php,Oop,我有一个php stdObject,它是一个对象,有时是一个对象数组 编辑:它已由SoapClient::\uu soapCall返回 如果有一个条目: stdClass Object ( [Event] => stdClass Object ( [Nr] => 7050 [Date] => 2016-11-30T00:00:00 ) ) 我的问题是: 相同的请求返回不同的数据类型,这正常吗 如果只有一个
SoapClient::\uu soapCall
返回
如果有一个条目:
stdClass Object
(
[Event] => stdClass Object
(
[Nr] => 7050
[Date] => 2016-11-30T00:00:00
)
)
我的问题是:
- 相同的请求返回不同的数据类型,这正常吗
- 如果只有一个条目,我是否应该对此进行“规范化”并生成一个对象数组
- 或者有没有其他建议的解决方法
- 我认为在这种情况下不合适。您应该保持界面不变。因此,如果您期望未知数量的元素,它应该始终是一个集合,即使在某些情况下只返回一个元素。但是,如果只需要一个元素,则应该忽略集合
$this->getAll(); //should always return a collection
$this->getOneById($id); //should return single item without collection, return null or throw exception if no element is found
关于你应该“规范化”(重构)这个问题,我想说这取决于你的工作量估计和你从重构中获得的好处。如果这种情况只发生在少数几个地方,而且将来不太可能在任何其他地方使用,我想你不应该麻烦。如果您决定重构,请非常小心,确保整个应用程序正常工作。如果你有测试-很好。我认为在这种情况下不合适。您应该保持界面不变。因此,如果您期望未知数量的元素,它应该始终是一个集合,即使在某些情况下只返回一个元素。但是,如果只需要一个元素,则应该忽略集合
$this->getAll(); //should always return a collection
$this->getOneById($id); //should return single item without collection, return null or throw exception if no element is found
关于你应该“规范化”(重构)这个问题,我想说这取决于你的工作量估计和你从重构中获得的好处。如果这种情况只发生在少数几个地方,而且将来不太可能在任何其他地方使用,我想你不应该麻烦。如果您决定重构,请非常小心,确保整个应用程序正常工作。如果您有测试-很好。我没有在问题中声明它,抱歉:数据是soap客户端调用的结果:
$this->soapClient = new \SoapClient($wsdlUrl, array('trace' => DEBUG_SOAP));
// ...
$result = $this->soapClient->__soapCall($method, array($method => $params));
我想让我困惑的是SoapClient::\uu soapCall
SOAP函数可以返回一个或多个值。如果只有一个值
是由SOAP函数返回的,\ uuu soapCall的返回值将
是一个简单的值(例如整数、字符串等)。如果有多个值
返回时,\uuuu soapCall将返回一个名为
输出参数
还有一个非常类似的问题:
这里有两个解决方案:
“正常化”(正确的词是什么?)我们得到数据后:
if (is_object($variable)){
$variable = array($variable);
}
而且,这相当于在我们得到请求之前重构请求–有一个soapClient设置强>
$soapConfig = array(
'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
'trace' => true
);
$client = new SoapClient($wsdlUrl, $soapConfig);
太棒了 我没有在问题中声明,抱歉:数据是soap客户端调用的结果:
$this->soapClient = new \SoapClient($wsdlUrl, array('trace' => DEBUG_SOAP));
// ...
$result = $this->soapClient->__soapCall($method, array($method => $params));
我想让我困惑的是SoapClient::\uu soapCall
SOAP函数可以返回一个或多个值。如果只有一个值
是由SOAP函数返回的,\ uuu soapCall的返回值将
是一个简单的值(例如整数、字符串等)。如果有多个值
返回时,\uuuu soapCall将返回一个名为
输出参数
还有一个非常类似的问题:
这里有两个解决方案:
“正常化”(正确的词是什么?)我们得到数据后:
if (is_object($variable)){
$variable = array($variable);
}
而且,这相当于在我们得到请求之前重构请求–有一个soapClient设置强>
$soapConfig = array(
'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
'trace' => true
);
$client = new SoapClient($wsdlUrl, $soapConfig);
太棒了 我认为这很正常,取决于你的数据来源。通常,如果请求了多个项,则应返回一个项集合,但如果只指定了一个项,则跳过该集合。如果数据源是某种外包端点,那么同一请求可能会根据参数生成不同类型的对象。也就是说,
GET/store
可能返回所有存储项,而GET/store/1
将返回id为1的单个项。不一致?我认为“不一致”是一个更好的词我认为这很正常,取决于你的数据来源。通常,如果请求了多个项,则应返回一个项集合,但如果只指定了一个项,则跳过该集合。如果数据源是某种外包端点,那么同一请求可能会根据参数生成不同类型的对象。也就是说,GET/store
可能返回所有存储项,而GET/store/1
将返回id为1的单个项。不一致?我认为“不一致”是一个更好的词谢谢你的反馈!我已经更详细地了解了我从何处获得这些数据,并将其添加为答案答案答案是正确的——这不好。我的SOAP客户端特例的解决方案在我自己的回答中。谢谢您的反馈!我已经更详细地了解了我从何处获得这些数据,并将其添加为答案答案答案是正确的——这不好。我对SOAP客户机的特殊情况的解决方案在我自己的答案中