PHP SoapClient类映射的优势

时间:2015-04-22 14:36:47

标签: php soap soap-client

有人能告诉我在PHP Soapclient中使用classmap选项的优势吗?也许有一些实际的例子?

2 个答案:

答案 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 值。 您可以将其用于其他更改,例如如果您喜欢将内部变量存储在数组中而不是使用直接属性。