没有重用创建的SOAP客户端对象


Is not reusing created SOAP client object

有人能告诉我为什么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)));

每次创建新的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)));

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