是不是重用创建的SOAP客户端对象

时间:2016-04-12 16:34:19

标签: php class soap

有人能告诉我为什么SOAP客户端没有被重用吗?它不断被初始化,应该从最后一次调用中重用它。

当我在初始化后打印出SOAP客户端对象时,它就在那里,但是在下次调用时会忘记它。

因此php脚本不断初始化连接。

我的代码:

class EcoAPI {

private $client;

public function getClient() {

    if (empty($this->client)) {
        echo "<br>initializing...";
        $this->initClient();
    }

    return $this->client;
}

private function initClient() {

    $settingsOld = Settings::GetOld();
    $this->client = new SoapClient("https://api.e-conomic.com/secure/api1/EconomicWebservice.asmx?WSDL", array("trace" => 1, "exceptions" => 1));
    $this->client->ConnectWithToken(array('token' => $settingsOld->economic_token_secret, 'appToken' => $settingsOld->economic_token_app));        

}
}

我通过以下方式连接:

$ecoApi = new EcoAPI();     
$result = $ecoApi->getClient()->Account_GetVatAccount(array('accountHandle' => (object) array('Number' => (string) $VatAccount)));

1 个答案:

答案 0 :(得分:1)

每次您创建新的EcoAPI对象时,它都不会拥有任何SOAP客户端信息。只要您使用注入相同的$ecoApi->getClient()->...对象,在整个代码中使用$ecoApi应该可以正常工作。

如果要确保每个EcoAPI对象都具有相同的连接对象,无论如何,您可以尝试使用静态方法使客户端成为静态属性来操作SOAP对象。

class EcoAPI {

    static private $client;

    static public function getClient() {
        if (empty(self::$client)) {
            echo "<br>initializing...";
            self::initClient();
        }
        return self::$client;
    }

    static private function initClient() {
        $settingsOld = Settings::GetOld();
        self::$client = new SoapClient("https://api.e-conomic.com/secure/api1/EconomicWebservice.asmx?WSDL", array("trace" => 1, "exceptions" => 1));
        self::$client->ConnectWithToken(array('token' => $settingsOld->economic_token_secret, 'appToken' => $settingsOld->economic_token_app));        
    }
}

并通过以下方式连接:

$result = EcoAPI::getClient()->Account_GetVatAccount(array('accountHandle' => (object) array('Number' => (string) $VatAccount)));

当然,我建议不要使用静态对象和方法,这会导致紧耦合。在我看来,最好的方法是根据需要注入实例化的对象。