SOAP函数返回一个stdClass

时间:2019-06-05 18:07:07

标签: php soap wsdl soap-client

我遇到一个PHP错误,我尝试从SOAP WSDL访问对象属性。

我猜它应该返回一个associativeArray类型,但是我试图做一个print_r并且stdClass仍然存在。

这是产品对象的WSDL结构:

<complexType name="catalogProductReturnEntity">
<all>
<element name="product_id" type="xsd:string" minOccurs="0"/>
<element name="sku" type="xsd:string" minOccurs="0"/>
<element name="set" type="xsd:string" minOccurs="0"/>
<element name="type" type="xsd:string" minOccurs="0"/>
<element name="categories" type="typens:ArrayOfString" minOccurs="0"/>
<element name="websites" type="typens:ArrayOfString" minOccurs="0"/>
<element name="created_at" type="xsd:string" minOccurs="0"/>
<element name="updated_at" type="xsd:string" minOccurs="0"/>
<element name="type_id" type="xsd:string" minOccurs="0"/>
<element name="name" type="xsd:string" minOccurs="0"/>
<element name="description" type="xsd:string" minOccurs="0"/>
<element name="short_description" type="xsd:string" minOccurs="0"/>
<element name="weight" type="xsd:string" minOccurs="0"/>
<element name="status" type="xsd:string" minOccurs="0"/>
<element name="url_key" type="xsd:string" minOccurs="0"/>
<element name="url_path" type="xsd:string" minOccurs="0"/>
<element name="visibility" type="xsd:string" minOccurs="0"/>
<element name="category_ids" type="typens:ArrayOfString" minOccurs="0"/>
<element name="website_ids" type="typens:ArrayOfString" minOccurs="0"/>
<element name="has_options" type="xsd:string" minOccurs="0"/>
<element name="gift_message_available" type="xsd:string" minOccurs="0"/>
<element name="price" type="xsd:string" minOccurs="0"/>
<element name="special_price" type="xsd:string" minOccurs="0"/>
<element name="special_from_date" type="xsd:string" minOccurs="0"/>
<element name="special_to_date" type="xsd:string" minOccurs="0"/>
<element name="tax_class_id" type="xsd:string" minOccurs="0"/>
<element name="tier_price" type="typens:catalogProductTierPriceEntityArray" minOccurs="0"/>
<element name="meta_title" type="xsd:string" minOccurs="0"/>
<element name="meta_keyword" type="xsd:string" minOccurs="0"/>
<element name="meta_description" type="xsd:string" minOccurs="0"/>
<element name="custom_design" type="xsd:string" minOccurs="0"/>
<element name="custom_layout_update" type="xsd:string" minOccurs="0"/>
<element name="options_container" type="xsd:string" minOccurs="0"/>
<element name="additional_attributes" type="typens:associativeArray" minOccurs="0"/>
</all>
</complexType>

这是我正在尝试的代码:

$product = $proxy->catalogProductInfo($sessionId, 38882);
print_r($product->additional_attributes);

additional_attributes(返回stdClass的属性)之外的所有属性均可以正常工作。

当我尝试访问Additional_attributes时,服务器返回以下内容:

Notice: Undefined property: stdClass::$additional_attributes in /Applications/XAMPP/xamppfiles/htdocs/php_test/test.php on line 23

1 个答案:

答案 0 :(得分:0)

每个定义,php soap客户端根据其使用的xml定义/ wsdl类型返回stdClass对象。收到的stdClass对象通常包含定义中描述的所有属性。如您所见,minoccurs="0"属性的定义中有一个additional_attributes属性。这意味着它可以发生,但不必这样做。因此,结果取决于xml响应中收到的值。

要避免这种行为,只需使用php类,如以下示例所示。 php soap客户端接受一个classmap参数,该参数告诉客户端与定义的类一起使用哪种复杂类型。

实体

class CatalogProductReturnEntity
{
    ...
    public $additional_attributes;
    ...
}

只需写下一个具有所有在xml定义中定义的属性的实体类。此类可用作肥皂客户端的实体。使用此实体类可以避免PHP注意到属性未定义。

具有类映射的Soap Client

下一步是告诉肥皂客户端,哪些类型用于复杂类型。

$client = new \SoapClien($wsdl, [
    'classmap' => [
        'catalogProductReturnEntity' => CatalogProductReturnEntity::class,
    ],
]);

$product = $client->catalogProductInfo($sessionId, 38882);

现在,当接收名称为catalogProductReturnEntity的复杂类型时,客户端知道要使用哪个类。由于我们的实体类具有名为additional_attributes的属性,因此您可以轻松地使用$product->additiona_attributes进行调用。如果没有收到additional_attributes属性的值,则该值为null