【发布时间】:2015-04-22 14:36:47
【问题描述】:
谁能告诉我在 PHP Soapclient 中使用 classmap 选项的优势?也许有一些实际的例子?
【问题讨论】:
标签: php soap soap-client
谁能告诉我在 PHP Soapclient 中使用 classmap 选项的优势?也许有一些实际的例子?
【问题讨论】:
标签: php soap soap-client
classmap 选项可用于将某些 WSDL 类型映射到 PHP 类。
例如,
class MyLoginResult {
protected $serverUrl;
protected $sessionId;
public function getServerUrl()
{
return $this->serverUrl;
}
public function getSessionId()
{
return $this->sessionId;
}
public function getServerInstance()
{
$match = preg_match(
'/https:\/\/(?<instance>[^-]+)\.example\.com/',
$this->serverUrl,
$matches
);
return $matches['instance'];
}
}
$client = new SoapClient("books.wsdl",
array('classmap' => array('LoginResult' => "MyLoginResult")));
$loginResult = $client->getLoginResult();
$instance = $loginResult->getServerInstance();
【讨论】:
作为对 hoangthienan 评论的补充,我将展示使用映射类时的另一个优势。
例如您可以通过 __set() 方法扩展该类,该方法将在 SoapClient 将其数据传递给映射类时触发(您应该知道,如果您的属性是公共的,则不会触发该方法)。
在这种情况下,您可以在将 SoapClient 传递的数据分配给您的数据类之前对其进行替换。
class MyLoginResult {
protected $serverUrl;
protected $sessionId;
private $is_logged_in;
public function __set($name, $value) {
if ($name == 'login_status') {
$this->is_logged_in = ($value == 'logged_in') ? true : false;
} else {
$this->$name = $value;
}
}
public function loginSuccessfull() {
return $this->is_logged_in;
}
// class code from hoangthienan
}
例如在这个例子中,我们从 Soap 中得到一个字符串,但是我们在我们的类中存储了一个布尔值。 您可以将其用于其他更改,例如如果您想将内部变量存储在数组中而不是使用直接属性。
【讨论】: