Я общаюсь с SOAP API, используя PHP класс SOAPClient. Один из вариантов позволяет переназначить типы, указанные в файле 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()
и получаю следующую ошибку:
Примечание: Undefined свойство: Результат:: $datap >
Как я могу вызвать функцию конструктора, которая мне нужна при получении ответа SOAP? Я попытался использовать __wakeup()
, но это тоже не сработало.
P.S. Я "решил" его с небольшим обходным решением, но я не думаю, что он идеален. Вот что я сделал:
function getData(){
if($this->data === NULL){
parent::__construct();
}
return $this->data[$this->name];
}