PHP SoapClient参数仅在我使用StdClass时才有效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP SoapClient参数仅在我使用StdClass时才有效相关的知识,希望对你有一定的参考价值。

我正在尝试使用SOAP API DOC WSDL并且由于某种原因请求总是失败,除非我使用stdClass实例作为参数,并且我试图找到解决这个问题的方法我只是不喜欢这样做和我更喜欢使用关联数组。

/* I'd like to get rid of these two classes if possible */
class countriesRequest{
    public $companyCode = "9999";
    public $allCountries = true;
}

class getCountries{
    public $objRequest;
    function __construct()
    {
        $this->objRequest = new countriesRequest;
    }
}


class Countries extends ApiMethod
{
    /**
     * @var string API Endpoint
     */
    private $endpoint;

    public function getAllCountries() {

        $client = new SoapClient("http://jsserver20.jimpisoft.pt/Rentway_WS_Demo/getCountries.asmx?wsdl", ['trace' => 1]);
        try {
            $result = $client->getCountries(new getCountries());
            var_dump($result->getCountriesResult->countries->any);
        } catch(SoapFault $exception) {
            dd($client->__getLastRequest());
        }
    }
}

每当我尝试使用关联数组时,SOAP服务器都会返回错误“对象引用未设置为对象的实例”。所以对于那些对SOAP更有经验的人来说,在这种情况下这项服务是否要求我使用stdClasses作为参数?或者有什么方法可以使用关联数组?

答案

您可以创建关联数组,然后将其转换为stdClass

有:

$object = json_decode(json_encode($yourAssociativeArray));

或者如果不是嵌套数组(只是键值),你可以这样做:

$object = (object)$yourAssociativeArray;
另一答案

错误消息告诉您该参数必须能够用作参考。为此,您必须先将其分配给变量。

$getCountriesRequest = new getCountries();
$getCountriesResponse = $client->getCountries($request);

你可以在这里阅读有关通过引用传递的信息:http://php.net/manual/en/language.references.pass.php

以上是关于PHP SoapClient参数仅在我使用StdClass时才有效的主要内容,如果未能解决你的问题,请参考以下文章

PHP - SoapClient::SoapClient 无法打开流:连接被拒绝

是否可以将元素名称映射到 php 类(SoapClient)

PHP SoapClient - 使用变量创建请求

PHP 中的 SoapClient 错误回退

使用php soapclient工具包显示访问netsuite wsdl无法加载wsdl

PHP 5 soapClient 结果为空 __getLastResponse 显示正确的 XML