我使用PHP的SOAPClient class與SOAP API進行通信。其中一個選項有讓您重新映射在WSDL文件用自己的類指定的類型:構造函數不從SOAP響應對象中調用
The classmap option can be used to map some WSDL types to PHP classes. This option must be an array with WSDL types as keys and names of PHP classes as values.
創建我的客戶是這樣的:
$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()
並得到以下錯誤:
Notice: Undefined property: Result::$data
我如何可以調用構造函數,我需要得到一個SOAP時響應?我嘗試使用__wakeup()
,但這似乎也沒有工作。
P.S.我用一個小的解決方法「解決」了它,但我不認爲它是理想的。下面是我所做的:
function getData(){
if($this->data === NULL){
parent::__construct();
}
return $this->data[$this->name];
}
您好,我只是好奇如何你使用$ api-> method('param') - > getName()時調用getData函數嗎?不要downvote我pls,我只是想學習的東西...我認爲該類應該有被稱爲方法的方法名稱,但我可以看到有任何方法getName()多數民衆贊成爲什麼我問... Thx提前你的回答:-) – Redrif
@Redrif:那只是一個小錯字,我很抱歉。我試圖從我的真實代碼中複製和粘貼(並更改事物的名稱)。這實際上應該是'$ api-> method('param') - > getData()'。這裏沒有魔力,只是在問題上的拼寫錯誤。 –