【发布时间】:2016-04-20 09:28:45
【问题描述】:
我正在使用 PHP 的 SOAPClient class 与 SOAP API 进行通信。其中一个选项允许您使用自己的类重新映射 WSDL 文件中指定的类型:
classmap 选项可用于将某些 WSDL 类型映射到 PHP 类。此选项必须是一个数组,其中 WSDL 类型作为键,PHP 类的名称作为值。
我这样创建我的客户:
$api = new SOAPClient('http://example.com/soap.wsdl', [
'location' => 'http://example.com/soap/endpoint',
'soap_version' => SOAP_1_2,
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
'cache_wsdl' => WSDL_CACHE_BOTH,
'classmap' => [
'APIResultObject' => 'Result'
],
# TODO: Set for debug only?
'trace' => TRUE,
'exceptions' => TRUE
]);
这很有效,当我调用$api->method('param') 时,我得到一个Result 对象(而不仅仅是一个StdClass 对象)。问题是Result::__construct() 方法永远不会被调用,所以Result 的一些私有属性永远不会被设置。
Result 是这样的:
class DataClass{
protected $data;
function __construct(){
$this->data = ['a' => 0, 'b' => 1, 'c' => 2];
}
}
class Result extends DataClass{
public $value, $name, $quantity;
function __construct(array $values){
parent::__construct();
foreach(['value', 'name', 'quantity'] as $var){
$this->$var = isset($values[$var]) ? $values[$var] : NULL;
}
}
function getData(){
return $this->data[$this->name];
}
}
我正在做$api->method('param')->getData() 并收到以下错误:
注意:未定义的属性:Result::$data
当我收到 SOAP 响应时,如何调用我需要的构造函数?我尝试使用__wakeup(),但这似乎也不起作用。
附:我用一个小的解决方法“解决”了它,但我认为它并不理想。这是我所做的:
function getData(){
if($this->data === NULL){
parent::__construct();
}
return $this->data[$this->name];
}
【问题讨论】:
-
你好,我只是好奇你在使用 $api->method('param')->getName() 时如何调用 getData 函数?请不要对我投反对票,我只是想学习一些东西...我认为该类应该具有要调用的方法的方法名称,但我可以看到任何方法 getName() 这就是我问的原因...提前谢谢你的答案:-)
-
@Redrif:这只是一个小错字,对不起。我试图从我的真实代码中复制并粘贴它(并更改事物的名称)。那实际上应该是
$api->method('param')->getData()。这里没有魔法,只是问题中的一个错字。
标签: php soap soap-client