有人能告诉我在PHP Soapclient中使用classmap选项的优势吗?也许有一些实际的例子?
答案 0 :(得分:1)
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();
答案 1 :(得分:0)
除了 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 获取一个字符串,但我们在我们的类中存储了一个 bool 值。 您可以将其用于其他更改,例如如果您喜欢将内部变量存储在数组中而不是使用直接属性。